網站伺服器

通常會使用 前端控制器模式 將網站伺服器收到的適當 HTTP 請求導向至單一 PHP 檔案。以下說明會解釋如何指示您的網站伺服器將 HTTP 請求傳送至您的 PHP 前端控制器檔案。

PHP 內建伺服器

在終端機中執行以下指令以啟動 localhost 網站伺服器,假設 *./public/* 是具有 *index.php* 檔案的公開可存取目錄

cd public/
php -S localhost:8888

如果您沒有使用 *index.php* 作為您的進入點,請適當變更。

警告:內建網站伺服器旨在協助應用程式開發。它也可協助進行測試目的或在受控環境下執行的應用程式示範。它並非旨在成為功能齊全的網站伺服器。不應在公共網路之上使用它。

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]

為確保 public/ 目錄不會出現在網址中,您應在 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 socket 位於 /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();