Nginx下支持ThinkPHP的Pathinfo和URl Rewrite模式

Nginx下支持ThinkPHP的Pathinfo和URl Rewrite模式
BY 孫 權 · 2014年8月6日

個人環境

系統 :    Ubuntu12.04    x86_64

環境 :    Nginx1.1.19+PHP5.3.10+Mongo2.6.3

因爲公司要用Nginx+Mongo+PHP,因此我要把剛剛配置好的LAMP推翻,而後從新安裝LNMP。軟件安裝就不在這裏介紹了,若是有須要,能夠看這裏。

如何安裝Nginx。

下面介紹如何使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/$1;
            #如果子目錄則使用下面這句,將subdir改爲目錄名稱便可。
            #rewrite ^/subdir/(.*)$ /subdir/index.php/$1;
    }
以上方法雖然是ThinkPHP官方給出的,想必也是通過驗證的,但悲催的是對我並不起做用。

2、個人解決方案

我是在sites(vhost)下配置的,在/etc/nginx/sites-available/目錄下。固然你也能夠直接在/etc/nginx/nginx.conf裏配置。
在localhost / {} 配置中加以下代碼:

#若是請求既不是一個文件,也不是一個目錄,則執行一下重寫規則
    if (!-e $request_filename)
    {
            #地址做爲將參數rewrite到index.php上。
            rewrite ^/(.*)$ /index.php/$1;
            #如果子目錄則使用下面這句,將subdir改爲目錄名稱便可。
            #rewrite ^/subdir/(.*)$ /subdir/index.php/$1;
    }
完整代碼以下:

location / {
                root /var/www;
                # First attempt to serve request as file, then
                # as directory, then fall back to index.html
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
                if (!-e $request_filename)
                {
                        rewrite ^/PHPParser/(.*)$ /PHPParser/index.php?s=$1 last;
                        break;
                }
        }

而後在localhost ~ \.php{}配置欄目中添加以下兩行:

fastcgi_split_path_info ^(.+\.php)(.*)$;                             
fastcgi_param PATH_INFO $fastcgi_path_info; 
完整配置以下

 location ~ \.php$ {
                root /var/www;
                try_files $uri = 404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
        #       # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        #
        #       # With php5-cgi alone:
                #fastcgi_pass 127.0.0.1:9000;
                fastcgi_split_path_info ^(.+\.php)(.*)$;
                fastcgi_param PATH_INFO $fastcgi_path_info;
        #       # With php5-fpm:
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }

大寶日記版權全部,轉載請註明出處。
原文地址:http://www.sundabao.com/nginx%E4%B8%8B%E6%94%AF%E6%8C%81thinkphp%E7%9A%84pathinfo%E5%92%8Curl-rewrite%E6%A8%A1%E5%BC%8F/
相關文章
相關標籤/搜索