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

Nginx 部署 ThinkPHP 完整指南:Pathinfo 模式配置詳解與避坑實戰

     編輯:PHP 相關知識

Nginx + ThinkPHP Pathinfo 模式零痛點配置

ThinkPHP 預設支援 PATHINFO、REWRITE、兼容模式。Nginx 原生不支援 PATHINFO,需通過 fastcgi_split_path_info 或 rewrite 實現。本文提供生產環境驗證的完整配置,解決「配了半天不生效、404、輸入文件未指定」等常見問題。

核心配置文件 (site-enabled/your-domain.conf)

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

關鍵點深度解析

1. `try_files $uri $uri/ /index.php$is_args$args;`

這是現代框架通用的單入口重寫規則,替代傳統 rewrite。邏輯:嘗試文件 -> 目錄 -> 最後轉發到 index.php 並保留查詢字串。ThinkPHP 會自動解析 $_SERVER['REQUEST_URI'] 獲取路由信息。

2. `fastcgi_split_path_info` 與 PATH_INFO

若 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 結尾的腳本名。

3. PHP-FPM 配置協同

編輯 /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

4. ThinkPHP 配置對接

config/app.php (TP6/8):

// 路由模式: 強制路由 (生產環境推薦)
'url_route_must' => true,

// PATHINFO 變量名 (Nginx 已正確傳遞 PATH_INFO, 通常無需改)
'var_pathinfo' => 's',

// URL 後綴 (可選)
'url_html_suffix' => 'html',

常見問題排查清單

現象可能原因解決方案
404 Not Foundroot 指向錯誤 / 入口文件不在 public / try_files 缺失確認 root 指向 public 目錄, try_files 規則正確
File not found / Primary script unknownSCRIPT_FILENAME 構建錯誤 / fastcgi_pass 路徑錯 / php-fpm 未運行檢查 $document_root$fastcgi_script_name, sock 文件權限與存在性
路由不生效 / 參數獲取失敗PATH_INFO 未正確傳遞 / ThinkPHP 路由配置問題啟用 fastcgi_split_path_info, 檢查 var_pathinfo 配置
靜態資源 404location / 攔截了靜態文件請求添加靜態資源 location 塊, 或確保 try_files $uri 在前
權限拒絕 (Permission denied)Nginx 用戶無權讀取項目文件 / sock 文件權限chown -R www-data:www-data /var/www/project; 設置 sock 權限 660

驗證步驟

  1. nginx -t 測試配置語法
  2. systemctl reload nginx 重載
  3. systemctl restart php8.1-fpm 重啟 PHP-FPM
  4. 訪問首頁、帶參數路由、靜態資源、不存在路由 (應進入框架 404 頁面)

此配置經多個生產項目驗證,支援 ThinkPHP 5.1/6.0/8.0,兼容性強、性能優、易維護。建議收藏作為標準模板。

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