通常會使用 前端控制器模式 將網站伺服器收到的適當 HTTP 請求導向至單一 PHP 檔案。以下說明會解釋如何指示您的網站伺服器將 HTTP 請求傳送至您的 PHP 前端控制器檔案。
在終端機中執行以下指令以啟動 localhost 網站伺服器,假設 *./public/* 是具有 *index.php* 檔案的公開可存取目錄
cd public/
php -S localhost:8888
如果您沒有使用 *index.php* 作為您的進入點,請適當變更。
警告:內建網站伺服器旨在協助應用程式開發。它也可協助進行測試目的或在受控環境下執行的應用程式示範。它並非旨在成為功能齊全的網站伺服器。不應在公共網路之上使用它。
確認 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]
為確保 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');
閱讀更多
這是網域 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 socket 位於 /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();