ThinkPHP、Laravel、Yii2 等框架依賴 Pathinfo 獲取路由信息,且生產環境通常要求 URL 中隱藏 index.php。本文針對 LNMP 一鍵包默認 Nginx 配置,提供最小改動、即時生效的三步配置法。
# /usr/local/nginx/conf/vhost/yourdomain.conf
location ~ [^/]\.php(/|$) {
# comment try_files $uri =404; to enable pathinfo
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
# include pathinfo.conf;
}
(/|$) 尾部,使 /index.php/controller/action 能匹配進入try_files $uri =404;:否則 Nginx 會在文件系統找不到 /index.php/controller/action 而直接返回 404include pathinfo.conf;:載入官方提供的 Pathinfo 參數設置(fastcgi_split_path_info、fastcgi_param PATH_INFO 等).php 後綴的靜態資源與路由轉發# 1. 新增:路由轉發(放在 php location 之前)
location / {
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php last;
}
}
# 2. 修改:PHP 處理
location ~ [^/]\.php {
# try_files $uri =404; ← 註釋掉
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
include pathinfo.conf; ← 取消註釋
}
# /usr/local/nginx/conf/pathinfo.conf
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
service nginx reload 或 nginx -s reloadhttps://yourdomain.com/index.php/controller/action → 應正常路由https://yourdomain.com/controller/action → 應同樣生效(隱藏 index.php)var_dump($_SERVER['PATH_INFO']) 應輸出 /controller/action| 現象 | 原因與解決 |
|---|---|
| 404 Not Found | try_files $uri =404 未註釋、或 pathinfo.conf 路徑錯誤 |
| 500 Internal Server Error | fastcgi_split_path_info 正則錯誤、PHP 代碼拋出異常 |
| 無限重定向 | location / 的 rewrite 缺少 last 旗標、或與其他 rewrite 衝突 |
| 靜態文件 404 | location / 的 !-e $request_filename 判斷失效,檢查 root 指令 |
config/app.php 中 url_route_on、url_route_must 設置正確public/.htaccess 不再生效(Nginx 不讀取),全部靠 Nginx rewriteurlManager.enablePrettyUrl = true、showScriptName = false#!/bin/bash
CONF="/usr/local/nginx/conf/vhost/yourdomain.conf"
cp $CONF $CONF.bak
sed -i 's/location ~ \[^\\/\]\\.php(\/|$)/location ~ [^\\/]\\.php/' $CONF
sed -i 's/try_files \$uri =404;/#try_files \$uri =404;/' $CONF
sed -i 's/# include pathinfo.conf;/include pathinfo.conf;/' $CONF
# 插入 location / 區塊(若不存在)
if ! grep -q 'location / {' $CONF; then
sed -i '/location ~ \[^\\/\]\\.php/i location / {\n if (!-e \$request_filename) {\n rewrite ^/(.*)$ /index.php last;\n }\n}\n' $CONF
fi
nginx -t && service nginx reload
完成上述配置,框架路由即可在「無 index.php、支援 Pathinfo」的乾淨 URL 下正常運行,符合現代 PHP 應用部署標準。