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

ThinkPHP Pathinfo 模式與 URL 重寫完整指南:從原理到 Apache/Nginx 配置

     編輯:PHP 相關知識

ThinkPHP 的 Pathinfo 模式(URL_MODEL=2)配合 URL 重寫,能生成無 index.php 的優雅靜態化 URL,利於 SEO 且符合 REST 風格。本文詳解解析規則、重寫原理、Apache/Nginx 配置與常見坑點。

Pathinfo 模式解析規則

URL 結構:

https://domain/app.php/模塊/控制器/操作/參數1/值1/參數2/值2/...
  • 啟用分組時:第一段為分組名,第二段為模塊,第三段為控制器,第四段為操作;
  • 參數必須成對出現,自動注入 $_GET;
  • 不支援問號傳參,所有參數走 Pathinfo。

範例對照

原始 URLPathinfo URL解析結果
/index.php/Blog/read/id/1/Blog/read/id/1模塊=Blog, 控制器=read, 參數 id=1
/index.php/Api/v1/User/list/page/2/size/20/Api/v1/User/list/page/2/size/20分組=Api, 模塊=v1, 控制器=User, 操作=list, page=2, size=20

URL 重寫原理

Web 服務器將不存在的文件/目錄請求重定向到 index.php,由 PHP 框架接管路由解析。

Apache (.htaccess)

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    # 除外真實存在的文件/目錄
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # 重寫到 index.php,保留 PATH_INFO
    RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
  • QSA (Query String Append) 保留原查詢字串;
  • PT (Pass Through) 傳遞給後續處理器(如 PHP);
  • 需確保 httpd.conf 載入 mod_rewrite 並允許 AllowOverride All。

Nginx 配置

server {
    listen 80;
    server_name example.com;
    root /var/www/html/public;

    index index.php index.html;

    location / {
        # 嘗試文件、目錄、最後 fallback 到 index.php
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        # 關鍵:支援 PATH_INFO
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

ThinkPHP 配置啟用

// config/app.php (TP6) 或 config/config.php (TP5)
'url_route_on' => true,        // 開啟路由
'url_route_must' => false,     // 強制路由(建議開發階段 false)
'url_convert' => true,         // URL 自動轉換(駝峰轉下劃線)
'url_html_suffix' => '',       // 去除 .html 後綴
// TP5 專用
'URL_MODEL' => 2,              // Pathinfo 模式
'URL_ROUTER_ON' => true,
'URL_ROUTE_RULES' => [],       // 自定義路由規則

常見問題排查

現象原因解決
404 Not Found重寫模塊未載入 / .htaccess 未生效檢查 mod_rewrite、AllowOverride、文件權限
參數無法獲取Nginx 未傳遞 PATH_INFO添加 fastcgi_split_path_info 規則
CSS/JS/圖片 404重寫規則攔截靜態資源確保 RewriteCond !-f !-d 在前;Nginx try_files 順序正確
雙重 index.php生成 URL 仍含 index.php檢查 URL_MODEL=2、路由配置、框架版本差異
中文參數亂碼URL 編碼不一致統一 UTF-8,Nginx 添加 charset utf-8;

最佳實踐建議

  1. 生產環境強制 HTTPS:重寫規則中添加 301 跳轉;
  2. 靜態資源走 CDN:Nginx location 區分動靜態,靜態文件直接過期緩存;
  3. 路由定義顯式化:避免完全依賴 Pathinfo 自動解析,核心業務寫具體路由規則;
  4. API 版本前綴:/api/v1/... 便於後續演進;
  5. 監控 404 日誌:發現異常路由及時修復。

掌握 Pathinfo + Rewrite 機制,能構建乾淨、可維護、SEO 友好的 URL 體系。

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