ThinkPHP在Nginx服務器上部署系統遇到的路徑問題

編程語言 技術 Robreto 2017-04-17

最近在linux服務器上用ThinkPHP開發了一套系統,開發完成後由於要遷移到正式服務器nginx上,才發現ngnix服務器默認是不支持ThinkPHP的pathinfo模式了。所以特地上網搜了一些解決方法:

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

location ~.*.(php|php5)?$

{

#原有代碼

}

修改成以下代碼#去掉$是為了不匹配行末,即可以匹配.php/,以實現pathinfo

#如果你不需要用到php5後綴,也可以將其去掉

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語句,在其上方加上以下語句:

  1. #如果請求既不是一個文件,也不是一個目錄,則執行一下重寫規則

if(!-e $request_filename)

{

#地址作為將參數rewrite到index.php上。

rewrite ^/(.*)$ /index.php/$1;

#若是子目錄則使用下面這句,將subdir改成目錄名稱即可。

#rewrite ^/subdir/(.*)$ /subdir/index.php/$1;

}

  1. 最後,保存配置文件,重啟nginx服務,把ThinkPHP的URL_MODEL設置為2,訪問下你的頁面,如果能正常訪問,恭喜你pathinfo配置成功了^_^


自己比對了一下這個教程和自己服務器的配置文件是一模一樣後,剛開始的時候還以為可能和這個教程的環境不一樣,然後又是在網上摸索到了後半夜也沒有搞明白是怎麼回事,服務器該不支持phpinfo還是不支持。在快要想更換成linux系統的時候,重啟了一下服務器,然後系統就支持phpinfo的模式了。看來nginx的重啟服務和重新加載配置文件,有時候並不是很穩定了

相關推薦

推薦中...