Skip to content

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

确保您的 .htaccessindex.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_nameerror_logaccess_logroot 指令。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();