通常使用 前端控制器模式 通过 Web 服务器收到的适当 HTTP 请求提交给单个 PHP 文件。以下说明解释了如何告知你的 Web 服务器将 HTTP 请求发送到你的 PHP 前端控制器文件。
假设 ./public/ 是包含 index.php 文件的公开可访问目录,在终端运行下列命令启动本地 Web 服务器
cd public/
php -S localhost:8888
如果你未使用 index.php 作为你的入口点,请适当地进行更改。
警告:内置 Web 服务器旨在帮助应用程序开发。对于测试目的或在受控环境中运行的应用程序演示,它可能也很有用。它并不是一个功能齐全的 Web 服务器。不应该在公共网络上使用它。
确保已安装和启用了 Apache mod_rewrite
模块。要启用 mod_rewrite
,可以在终端中键入以下命令
sudo a2enmod rewrite
sudo a2enmod actions
确保你的 .htaccess
and index.php
文件位于同一个公开可访问目录中。.htaccess
文件应包含下列代码
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
为确保 public/
目录不会出现在 URL 中,你应在 public/
目录上方添加第二个 .htaccess
文件,其中包含以下内部重定向规则
RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
这些 .htaccess
文件需要 URL 重写。
确保启用 Apache 的mod_rewrite
模块且你的虚拟主机使用AllowOverride
选项进行配置,以便可以使用 .htaccess
重写规则:为此,必须在具有 root 权限的编辑器中打开文件 /etc/apache2/apache2.conf。
将 <Directory ...>
规则从 AllowOveride None
更改为 AllowOveride All
。
示例
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
最后,必须重新加载 Apache 的配置。要重新启动 Apache 网络服务器,输入
sudo service apache2 restart
此命令适用于大多数 Debian/Ubuntu 变体。对于所有其他 Linux 发行版,请查阅你的特定 Linux 发行版的文档,以了解如何重新启动 Apache。
在子目录中运行
此示例假定前端控制器位于 public/index.php
中。
若要将子目录“重定向”至前端控制器,请在 public/
目录上方创建第二个 .htaccess
文件。
第二个 .htaccess
文件应包含此代码
RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
也可以设置基本路径,以便路由器使用路由注册中设置的路径来匹配浏览器 URL。通过 setBasePath()
方法来完成此操作。
$app->setBasePath('/myapp');
了解详情
这是一个供域名 example.com
使用的 Nginx 虚拟主机配置示例。它在端口 80上监听入站 HTTP 连接。它假定有一个 PHP-FPM 服务器在端口 9123 上运行。你应使用你自己的值更新 server_name
、error_log
、access_log
和 root
规则。 root
规则是到你的应用程序的公共文档根目录的路径,你的 Slim 应用的 index.php
前端控制器文件应在此目录中。
server {
listen 80;
server_name example.com;
index index.php;
error_log /path/to/example.error.log;
access_log /path/to/example.access.log;
root /path/to/public;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ \.php {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9123;
}
}
Caddy 配置位于 /etc/caddy/Caddyfile
中。Caddy 需要php-fpm
并运行 FPM 服务器。假设 FPM 套接字在 /var/run/php/php-fpm.sock
中,并且你的应用程序位于 /var/www
中,那么以下配置应能立即运行。
:80 {
# Set-up the FCGI location
php_fastcgi unix//var/run/php/php-fpm.sock
# Set this path to your site's directory.
root * /var/www/public
}
:443 {
tls internal
# Set-up the FCGI location
php_fastcgi unix//var/run/php/php-fpm.sock
# Set this path to your site's directory.
root * /var/www/public
}
确保 Web.config
和 index.php
文件位于相同的公共可访问目录中。Web.config
文件应包含此代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="slim" patternSyntax="Wildcard">
<match url="*" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="index.php" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
您的 lighttpd 配置文件应包含此代码(以及您可能需要的其他设置)。此代码需要 lighttpd >= 1.4.24。
url.rewrite-if-not-file = ("(.*)" => "/index.php/$0")
这假定 Slim 的 index.php
位于您项目的根文件夹(www 根目录)中。
如果您希望从服务器根目录中的子目录运行 Slim 应用程序,而不是创建虚拟主机,则可以在 AppFactory::create();
之后配置 $app->setBasePath('/path-to-your-app');
。假设您的服务器根目录为 /var/www/html/
,而 Slim 应用程序的路径为 /var/www/html/my-slim-app
,则您可以将基本路径设置为 $app->setBasePath('/my-slim-app');
。
<?php
use Slim\Factory\AppFactory;
// ...
$app = AppFactory::create();
$app->setBasePath('/my-slim-app');
// ...
$app->run();