天天看點

【Nginx重寫】下支援ThinkPHP的Pathinfo和URl Rewrite模式

<!-- 正文 -->

1、ThinkPHP給出了ThinkPHP的官方解決方案,如下:

打開Nginx的配置檔案 /etc/nginx/nginx.cof 一般是在這個路徑,根據你的安裝路徑可能有所變化。如果你配置了vhost,而且隻需要你這一個vhost支援pathinfo的話,可以直接打開你的vhost的配置檔案。找到類似如下代碼(不同版本的nginx可能稍有不同,但是相差不會很遠):

location ~ .php
        {
                #原有代碼
                
                #定義變量 $path_info ,用于存放pathinfo資訊
                set $path_info "";
                #定義變量 $real_script_name,用于存放真實位址
                set $real_script_name $fastcgi_script_name;
                #如果位址與引号内的正規表達式比對
                if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
                        #将檔案位址指派給變量 $real_script_name
                        set $real_script_name $1;
                        #将檔案位址後的參數指派給變量 $path_info
                        set $path_info $2;
                }
                #配置fastcgi的一些參數
                fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
                fastcgi_param SCRIPT_NAME $real_script_name;
                fastcgi_param PATH_INFO $path_info;
        }      

這樣,nginx伺服器就可以支援pathinfo了。但是如果要支援ThinkPHP的URL_MODE設定為2的模式,還需要配置rewrite規則。找到access_log語句,在其上方加上以下語句:

#如果請求既不是一個檔案,也不是一個目錄,則執行一下重寫規則
    if (!-e $request_filename)
    {
            #位址作為将參數rewrite到index.php上。
            rewrite ^(.*)$ /index.php?s=$1 last;
            #若是子目錄則使用下面這句,将subdir改成目錄名稱即可。
            #rewrite ^/subdir/(.*)$ /subdir/index.php/$1;
    }      

以上方法雖然是ThinkPHP官方給出的

<!-- 版權 -->

繼續閱讀