ThinkPHP項目,當使用Apache服務器時,Apache服務器自己支持pathinfo模式,ThinkPHP的4種訪問模式都沒問題;當使用Nginx時,碰到問題,必須使用兼容模式訪問。
查找不少文檔,概括緣由及解決方案以下:php
緣由:低版本的Nginx不支持pathinfo模式;高版本的Nginx(大約0.7之後)支持,但默認沒有開啓。
解決解決方案:html
一、開啓Nginx的pathinfo模式:
在站點配置文件中找到 location ~ \.php$ {...} 那部分,把那個 $ 符號刪除,而後在{}中添加如下代碼:linux
fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
保存,重啓。這時Nginx已經支持pathinfo,訪問www.xxx.com/index.php/admin/index/test查看結果
注意:若是模板文件中使用了U()函數,fastcgi_split_path_info部分要替換爲服務器
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
二、rewrite重寫,隱藏入口文件index.php
在站點配置文件中找到 location / {...}這部分,在裏面添加如下代碼:函數
# 專門針對tp的rewrite模式 if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; break; }
保存,重啓。這時Nginx完美支持pathinfo模式,訪問www.xxx.com/admin/index/test查看結果spa
(PS:該篇從原理上講解Nginx對ThinkPHP的支持,上篇轉載的文章完美解決了ThinkPHP和Nginx的配置,不求理解的童鞋能夠採用拿來主義!).net
有關Nginx的CGI、Fastcgi、pathinfo原理的講解,參見這篇文章,做者講解得很是詳細,感謝分享!code