首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

LNMP 環境啟用 Pathinfo 並隱藏 index.php:Nginx 配置三步走

     編輯:PHP 相關知識

LNMP/Nginx 開啟 Pathinfo 模式並隱藏 index.php 完整配置指南

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

三步修改

  1. 修改正則匹配:去除 (/|$) 尾部,使 /index.php/controller/action 能匹配進入
  2. 註釋 try_files $uri =404;:否則 Nginx 會在文件系統找不到 /index.php/controller/action 而直接返回 404
  3. 啟用 include pathinfo.conf;:載入官方提供的 Pathinfo 參數設置(fastcgi_split_path_info、fastcgi_param PATH_INFO 等)
  4. 新增前置 location /:處理無 .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;  ← 取消註釋
}

pathinfo.conf 內容參考(LNMP 內置)

# /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;

驗證生效

  1. service nginx reload 或 nginx -s reload
  2. 瀏覽器訪問 https://yourdomain.com/index.php/controller/action → 應正常路由
  3. 訪問 https://yourdomain.com/controller/action → 應同樣生效(隱藏 index.php)
  4. PHP 代碼 var_dump($_SERVER['PATH_INFO']) 應輸出 /controller/action

常見問題排查

現象原因與解決
404 Not Foundtry_files $uri =404 未註釋、或 pathinfo.conf 路徑錯誤
500 Internal Server Errorfastcgi_split_path_info 正則錯誤、PHP 代碼拋出異常
無限重定向location / 的 rewrite 缺少 last 旗標、或與其他 rewrite 衝突
靜態文件 404location / 的 !-e $request_filename 判斷失效,檢查 root 指令

ThinkPHP/Laravel/Yii2 專項提示

  • ThinkPHP:確認 config/app.php 中 url_route_on、url_route_must 設置正確
  • Laravel:確認 public/.htaccess 不再生效(Nginx 不讀取),全部靠 Nginx rewrite
  • Yii2:urlManager.enablePrettyUrl = true、showScriptName = false

一鍵腳本(適用 LNMP 1.5+)

#!/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 應用部署標準。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved