Web 服务器

通常使用 前端控制器模式 通过 Web 服务器收到的适当 HTTP 请求提交给单个 PHP 文件。以下说明解释了如何告知你的 Web 服务器将 HTTP 请求发送到你的 PHP 前端控制器文件。

PHP 内置服务器

假设 ./public/ 是包含 index.php 文件的公开可访问目录,在终端运行下列命令启动本地 Web 服务器

cd public/
php -S localhost:8888

如果你未使用 index.php 作为你的入口点,请适当地进行更改。

警告:内置 Web 服务器旨在帮助应用程序开发。对于测试目的或在受控环境中运行的应用程序演示,它可能也很有用。它并不是一个功能齐全的 Web 服务器。不应该在公共网络上使用它。

Apache 配置

确保已安装和启用了 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');

了解详情

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 {
        # 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
}

使用自签名证书进行 HTTPS 配置

: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
}

IIS

确保 Web.configindex.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;
// ...

$app = AppFactory::create();
$app->setBasePath('/my-slim-app');

// ...

$app->run();