愿文出处:http://www.thinkphp.cn/code/937.html
号称最完美的解决方案(没有测试):http://blog.csdn.net/tinico/article/details/18033573
--------------------------------------------------------------------------------------------------------------------------------------------
nginx下基于ThinkPHP框架的网站url重写
nginx下的基于thinkphp的应用的url重写,需了解thinkphp的各种url格式参数的处理逻辑以及nginx重写的原理。简单点说,无论哪种url格式,nginx都需要执行ThinkPHP下的应用单一入口文件,然后将各种url格式按照一定的格式规则进行进行参数化处理,最终执行指定模块与控制器;这个过程用户是看不到的,用户只能看到各种规则的url,这些url的规则如下:
- #第一种 普通get多参数方式
- http://www.jb100.net/index.php?m=Info&a=usrInfo
- #第二种 pathinfo方式
- http://www.jb100.net/index.php/Info/usrInfo
- #带有get的其他变量
- http://www.jb100.net/index.php/Info/usrInfo/Id/1
复制代码
htt://www.jb100.net/index.php?s=Info/usrInfo
#带有get的其他变量
htt://www.jb100.net/index.php?s=Info/usrInfo/Id/1
/*
#当然这三种模式还可以附带文件后缀
#其实合并起来也就3种
#附带后缀只是上述三种规则的细微变化
#TinkPHP框架核心代码获取到以上三种模式的参数后
#会进行特定的处理 带不带后缀 带哪种后缀 均可配置
#也就是如下几种规则
*/
- #第一种
- http://www.jb100.net/index.php/Info/usrInfo.html
- #第二种
- http://www.jb100.net/index.php?s=Info/usrInfo.html
复制代码
什么是pathinfo?pathinfo是php的功能,nginx并没有pathinfo功能,在php中书写如下代码:
- <?php
- print_r(pathinfo('http://www.jb100.net/test/index.txt'));
- ?>
复制代码
- Array
- (
- [dirname] => http://www.jb100.net/test
- [basename] => index.txt
- [extension] => txt
- [filename] => index
- )
复制代码
ThinkPHP就采用了这种思想,将单一入口的url传参格式化,典型的基于ThinKPHP的url示例如下:
- http://www.jb100.net/index.php/Usr/UsrInfo
复制代码
- http://www.jb100.net/index.php?m=Usr&a=UsrInfo
复制代码
有了这种思路,nginx的url重写就有了最原始的写法了,对于上述pathinfo的格式化url,nginx在不做url重写时会把它当做一个路径来执行,一般来说没有谁会吃多了撑得在网站根目录下建立一个名字叫index.php的目录(注意:是目录,不是一般意义上的文件),所以第一种url重写出现了:
#一下是nginx配置文件的代码片段 仅书写url重写的部分
- location / {
- root /var/www;
- index index.html index.htm index.php;
- if (!-d $request_filename) {
- rewrite ^/(.*)/(.*)/*$ /index.php?m=$1&a=$2 last;
- break;
- }
- }
复制代码
#第一种,未隐藏index.php 但url路径中有.html后缀
- http://www.jb100.net/index.php/Usr/UsrInfo.html
复制代码
- http://www.jb100.net/Usr/UsrInfo
- 或
- http://www.jb100.net/Usr/UsrInfo/
复制代码
- http://www.jb100.net/Usr/UsrInfo.html
复制代码
#ThinkPHP可以处理的传参形式
- http://www.jb100.net/index.php?s=/Usr/UsrInfo
复制代码
所以又一种nginx的url重写出现了:
- location / {
- root /var/www;
- index index.html index.htm index.php;
- if (!-e $request_filename) {
- rewrite ^(.*)$ /index.php?s=$1 last;
- break;
- }
- }
复制代码
- location / {
- root /var/www;
- index index.html index.htm index.php;
#文件不存,则执行下面规则 - if (!-e $request_filename) {
- rewrite ^/index.php(.*)$ /index.php?s=$1 last;
- rewrite ^(.*)$ /index.php?s=$1 last;
- break;
- }
- }
复制代码