現在使用thinkphp框架程序的客戶特別多,很多使用了軍哥的lnmp生產環境,但是NGINX本身對thinkphp框架支持的不是特別好。
比如pathinfo就是比較常見的問題,所以我們整理下解決方法供大家解決。
忠告:用thinkphp的用戶還是建議使用IIS或者apche來運行網站,實在對nginx喜歡的不得了可以使用軍哥的lnmpa,這也是一個不錯的組合,1G以上的主機推薦使用,這樣thinkphp就不是問題了。
打開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語句,在其上方加上以下語句:
#如果請求既不是一個文件,也不是一個目錄,則執行一下重寫規則
if (!-e $request_filename)
{
#地址作為將參數rewrite到index.php上。
rewrite ^/(.*)$ /index.php/$1;
#若是子目錄則使用下面這句,將subdir改成目錄名稱即可。
#rewrite ^/subdir/(.*)$ /subdir/index.php/$1;
}
復制代碼 最后,保存配置文件,重啟nginx服務,把ThinkPHP的URL_MODEL設置為2,訪問下你的頁面,如果能正常訪問,恭喜你pathinfo配置成功了^_^
另一種快速的方法:
在支付寶回調,和微信回調方法中。正常不支持參數中帶 ?s= ,所以要開啟THINKPHP 的PATHINFO模式 。
THINKPHP 官方論壇 和網絡上很多NGINX配置教程不是太完善的。
我一直比較喜歡使用lnmp.org配置服務器環境。
所以本文將介紹 LNMP 配置NGINX 支持THINKPHP PATHINFO模式 。
方法很簡單 。
1,修改PHP.INI 支持 PHPINOF
PHP配置文件:/usr/local/php/etc/php.ini
更改php.ini
找到:cgi.fix_pathinfo=0
更改為:cgi.fix_pathinfo=1
2.修改nginx對應配置文件
/usr/local/nginx/conf/vhost/你的域名配置文件
去掉include pathinfo的#,在try_files前加#;
3.重啟lnmp即可。
lnmp restart
以上兩種方法都可以解決nginx下對thinkphp的pathinfo的支持。


發表評論 取消回復