公司有一款即將上線的應用服務端是基於ThinkPHP寫的,本地測試無異常,上傳到外網服務器後沒法鏈接。這可把我和個人小夥伴們嚇死了,怎麼回事兒,本地測試都是對的呀!php
我和個人小夥伴們開始找緣由,換了一臺服務器,上傳上去測試可行。這兩臺服務器的區別在於,一臺是LAMP,一臺是LNMP。而出問題的就是那天LNMP。度娘後知道,nginx默認狀況下不支pathinfo模式,從而不能支持ThinkPHP。html
ThinkPHP支持經過PATHINFO和URL rewrite的方式來提供友好的URL,只須要在配置文件中設置 'URL_MODEL' => 2 便可。在Apache下只須要開啓mod_rewrite模塊就能夠正常訪問了,可是Nginx中默認是不支持PATHINFO的,因此nginx默認狀況下是不支持thinkphp的。不過咱們能夠經過修改nginx的配置文件來讓其支持thinkphp。thinkphp
讓nginx支持pathinfo,支持thinkphp服務器
咱們打開nginx的配置文件,若是是想某個站點支持,請打開對應站點的配置文件測試
咱們註釋掉配置文件中那些被我圈出來的語句(location ~ \.php$ {……}這一段裏面的),咱們將對這部分進行重寫!spa
將重寫後的代碼添加進去。htm
添加的代碼以下:ip
.........................................ci
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錯誤。