ThinkPHP 預設支援 PATHINFO、REWRITE、兼容模式。Nginx 原生不支援 PATHINFO,需通過 fastcgi_split_path_info 或 rewrite 實現。本文提供生產環境驗證的完整配置,解決「配了半天不生效、404、輸入文件未指定」等常見問題。
server {
listen 80;
server_name your-domain.com;
root /var/www/your-project/public; # ThinkPHP 6/8 入口在 public 目錄
index index.php index.html;
# 關鍵: 統一入口, 非靜態資源轉發到 index.php
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
# PHP 處理塊
location ~ \.php$ {
# 安全: 防止惡意腳本執行 (cgi.fix_pathinfo=0 配合)
try_files $fastcgi_script_name =404;
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 根據實際 PHP-FPM sock 路徑修改
# fastcgi_pass 127.0.0.1:9000; # 或 TCP 端口
fastcgi_index index.php;
include fastcgi_params; # 標準參數
# 核心: 正確構建 SCRIPT_FILENAME 和 PATH_INFO
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
# ThinkPHP 6/8 需要的額外參數 (可選)
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
# 靜態資源緩存
location ~* \.(css|js|jpg|jpeg|png|gif|ico|woff|woff2)$ {
expires 30d;
access_log off;
}
# 隱藏敏感文件
location ~ /\.(env|git|htaccess) { deny all; }
}
這是現代框架通用的單入口重寫規則,替代傳統 rewrite。邏輯:嘗試文件 -> 目錄 -> 最後轉發到 index.php 並保留查詢字串。ThinkPHP 會自動解析 $_SERVER['REQUEST_URI'] 獲取路由信息。
若 ThinkPHP 配置為 'url_route_must' => true 或需獲取 PATH_INFO,需確保 Nginx 正確傳遞:
location ~ \.php$ {
# ...
# 正則捕獲腳本名與 pathinfo
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
注意: 正則順序很重要,^(.+\.php)(/.+)$ 必須匹配 .php 結尾的腳本名。
編輯 /etc/php/8.1/fpm/pool.d/www.conf (路徑視版本而定):
; 安全設置, 防止 Nginx 傳遞惡意路徑 security.limit_extensions = .php ; 性能調優 (根據服務器內存調整) pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 15 pm.max_requests = 1000
config/app.php (TP6/8):
// 路由模式: 強制路由 (生產環境推薦) 'url_route_must' => true, // PATHINFO 變量名 (Nginx 已正確傳遞 PATH_INFO, 通常無需改) 'var_pathinfo' => 's', // URL 後綴 (可選) 'url_html_suffix' => 'html',
| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| 404 Not Found | root 指向錯誤 / 入口文件不在 public / try_files 缺失 | 確認 root 指向 public 目錄, try_files 規則正確 |
| File not found / Primary script unknown | SCRIPT_FILENAME 構建錯誤 / fastcgi_pass 路徑錯 / php-fpm 未運行 | 檢查 $document_root$fastcgi_script_name, sock 文件權限與存在性 |
| 路由不生效 / 參數獲取失敗 | PATH_INFO 未正確傳遞 / ThinkPHP 路由配置問題 | 啟用 fastcgi_split_path_info, 檢查 var_pathinfo 配置 |
| 靜態資源 404 | location / 攔截了靜態文件請求 | 添加靜態資源 location 塊, 或確保 try_files $uri 在前 |
| 權限拒絕 (Permission denied) | Nginx 用戶無權讀取項目文件 / sock 文件權限 | chown -R www-data:www-data /var/www/project; 設置 sock 權限 660 |
nginx -t 測試配置語法systemctl reload nginx 重載systemctl restart php8.1-fpm 重啟 PHP-FPM此配置經多個生產項目驗證,支援 ThinkPHP 5.1/6.0/8.0,兼容性強、性能優、易維護。建議收藏作為標準模板。