Thinkphp5 Nginx Pathinfo配置


server {
    listen 80;
    server_name sui.com;
    root   /tmmee/sad.cn/public;
    index  index.php index.html index.htm;
  
  location ~* ^.+.(jpg|jpeg|gif|css|png|js|thumb) {
       expires 30d;
   }
   location / {
    try_files $uri @default;
}

location @default {
    fastcgi_pass            127.0.0.1:9000;
    fastcgi_param           SCRIPT_FILENAME $document_root/index.php;
    fastcgi_param           PATH_INFO       $fastcgi_script_name;
    fastcgi_param           PATH_TRANSLATED $document_root/index.php;
    include                 fastcgi_params;
}

location ~ \.php($|/) {
    fastcgi_pass            127.0.0.1:9000;
    fastcgi_split_path_info ^(.+?\.php)(/.+)$;
    fastcgi_param           SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param           PATH_INFO       $fastcgi_path_info;
    fastcgi_param           PATH_TRANSLATED $document_root$fastcgi_script_name;
    include                 fastcgi_params;
}

}

 

 

使用過 ThinkPHP 框架開發應用的同學應該都會知道,它有一種 URL 模式是 pathinfo,看起來類似下面的 URL:

http://example.com/module/controller/action/key1/value1/key2/value2.html

其實上面的 URL 的原型是下面的樣子:

// 這個才是正宗的 URL,上面那個是冒牌的 http://example.com/index.php?m=module&c=controller&a=action&key1=value1&key2=value2

既然 pathinfo 模式的 URL 不是正宗的,那為什么不用正宗的呢,用正宗的不好嗎?相對於正宗的 URL,pathinfo 模式的確實是有優勢的,以下簡單列舉幾項它的好處。

  • 它提供了最好的SEO支持
  • 可以實現 URL 的偽靜態
  • 它看起來更簡潔、更好看

pathinfo 模式的 URL 有這么多優點,那我們肯定要支持了。ThinkPHP 更多的 URL 模式配置及實現,可以參考這篇文檔。

本文主要討論的是 pathinfo 模式的 URL 在 Nginx 中的實現,ThinkPHP 官方文檔中沒有介紹,但是它實現起來也挺簡單的。以下是實現過程的一些思考。

一個標准的通用的 URL 格式是類似下面那樣子的:

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

參照通用的 URL 格式,對比可以發現,pathinfo 模式的相對於標准模式的 URL,有兩個地方的區別比較大,一個是沒有了 index.php 文件,另一個是查詢參數並沒有使用符號“?”隔開。

現在要做的就是在 Nginx 接收的 pathinfo 模式的 URL 請求時,將它還原成標准的 URL 模式,這樣服務器就能正常處理了。

把缺失的 index.php 文件補上

這個需要用到 Nginx 的 rewrite 指令,它的作用是將請求的 URI 替換成目標 URL。在這里需要達到的效果是,將

http://example.com/module/controller/action/key1/value1/key2/value2.html

替換成

http://example.com/index.php/module/controller/action/key1/value1/key2/value2.html

當然,並不是所有的 URI 都會進行此規則的重寫,只有那些不是文件的 URI 才進行重寫。所以,關於重寫的指令將會類似下面的:

# 如果請求的文件不存在,則進行 URI 重寫 # 在原有的基礎上添加入口文件 index.php if (!-e $request_filename) { rewrite ^/(.*)$ /index.php/$1 last; }

通過以上配置就能達到補全 index.php 入口文件的效果了。

區分符號 ?前后的內容

在通用的 URL 中,符號“?”是具有特殊作用的,它是用來將查詢字符串和前面的文件隔開。在 pathinfo 模式的 URL 中,符號“?”沒有了,也就是說,服務器無法區分 URI 中哪些是文件,哪些是查詢字符串了。所以,我們的目的是將 pathinfo 模式中本來應該由符號“?”區分的內容給手動區分開來。

還好,Nginx 中有個指令可以實現我們的目的,fastcgi_split_path_info。它可以將正則表達式定義的兩個串分別賦值給變量 $fastcgi_script_name 和變量 $fastcgi_path_info,以供后文使用。更多關於 fastcgi_split_path_info 的信息,請查閱這里

相關配置類似下面的代碼:

 
         

server {
listen 80;
server_name sui.com;

 
         

root /tmmee/sad.cn/public;

 
         

location / {

index index.php index.html index.htm;

 
         

if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
}
}

 
         

location ~ ^(.+\.php)(.*)$ {

fastcgi_pass 127.0.0.1:9000;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;

 
         

include fastcgi_params;
}
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM