公司有一款即將上線的應用服務端是基於ThinkPHP寫的,本地測試無異常,上傳到外網服務器后無法連接。這可把我和我的小伙伴們嚇死了,怎么回事兒,本地測試都是對的呀!
我和我的小伙伴們開始找原因,換了一台服務器,上傳上去測試可行。這兩台服務器的區別在於,一台是LAMP,一台是LNMP。而出問題的就是那天LNMP。度娘后知道,nginx默認情況下不支pathinfo模式,從而不能支持ThinkPHP。
ThinkPHP支持通過PATHINFO和URL rewrite的方式來提供友好的URL,只需要在配置文件中設置 'URL_MODEL' => 2 即可。在Apache下只需要開啟mod_rewrite模塊就可以正常訪問了,但是Nginx中默認是不支持PATHINFO的,所以nginx默認情況下是不支持thinkphp的。不過我們可以通過修改nginx的配置文件來讓其支持thinkphp。
我們打開nginx的配置文件,如果是想某個站點支持,請打開對應站點的配置文件
我們注釋掉配置文件中那些被我圈出來的語句(location ~ \.php$ {……}這一段里面的),我們將對這部分進行重寫!
將重寫后的代碼添加進去。
添加的代碼如下:
.........................................
location / {
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
break;
}
}
location ~ \.php {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;(改成fastcgi_params或fastcgi.conf)
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
}
...................................
一定要注釋到原來的location ~ \.php$ {……}這一段里面的代碼
不要漏掉{}
Nginx配置文件里 if 和后面的括號之間要有一個空格,不然會報unknown directive錯誤。



