Web 服务器
通常,使用前端控制器模式将 Web 服务器收到的适当的 HTTP 请求导向单个 PHP 文件。以下说明解释了如何告诉您的 Web 服务器将 HTTP 请求发送到您的 PHP 前端控制器文件。
PHP 内置服务器
在终端中运行以下命令以启动本地主机 Web 服务器,假设 ./public/ 是一个可公开访问的目录,其中包含 index.php 文件:
cd public/
php -S localhost:8888
如果您不使用 index.php 作为入口点,请相应地进行更改。
警告: 内置 Web 服务器设计用于辅助应用程序开发。它也可能用于测试目的或在受控环境中运行应用程序演示。它不是一个完整功能的 Web 服务器。不应在公共网络上使用它。
Apache 配置
确保已安装并启用了 Apache 的 mod_rewrite 模块。
要启用 mod_rewrite,可以在终端中输入以下命令:
sudo a2enmod rewrite
sudo a2enmod actions
确保您的 .htaccess 和 index.php 文件位于同一可公开访问的目录中。
.htaccess 文件应包含以下代码:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
为了确保在 URL 中不显示 public/ 目录,您应该在 public/ 目录上方添加第二个 .htaccess 文件,其中包含以下内部重定向规则:
RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
这些 .htaccess 文件需要 URL 重写。
确保启用了 Apache 的 mod_rewrite 模块,并且已配置虚拟主机以便可以使用 .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 Web 服务器,请输入:
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');
阅读更多
Nginx 配置
以下是针对域名 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
Caddy 配置文件位于 /etc/caddy/Caddyfile。Caddy 需要 php-fpm,并且需要运行 FPM 服务器。
假设 FPM 套接字位于 /var/run/php/php-fpm.sock,您的应用程序位于 /var/www,以下配置应该可以直接使用。
监听任意请求的 HTTP 配置
:80 {
# 设置 FCGI 位置
php_fastcgi unix//var/run/php/php-fpm.sock
# 将此路径设置为您站点的目录。
root * /var/www/public
}
使用自签名证书的 HTTPS 配置
:443 {
tls internal
# 设置 FCGI 位置
php_fastcgi unix//var/run/php/php-fpm.sock
# 将此路径设置为您站点的目录。
root * /var/www/public
}
IIS
确保 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 配置文件应包含此代码(以及其他您可能需要的设置)。此代码要求 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;
use Slim\Middleware\OutputBufferingMiddleware;
// ...
$app = AppFactory::create();
$app->setBasePath('/my-slim-app');
// ...
$app->run();