nginx下的基于thinkphp的應用的url重寫,,需了解thinkphp的各種url格式參數(shù)的處理邏輯以及nginx重寫的原理,。簡單點說,無論哪種url格式,,nginx都需要執(zhí)行ThinkPHP下的應用單一入口文件,,然后將各種url格式按照一定的格式規(guī)則進行進行參數(shù)化處理,最終執(zhí)行指定模塊與控制器,;這個過程用戶是看不到的,,用戶只能看到各種規(guī)則的url,這些url的規(guī)則如下:
htt://www.jb100.net/index.php?m=Info&a=usrInfo
#第二種 pathinfo方式
htt://www.jb100.net/index.php/Info/usrInfo
#帶有get的其他變量
htt://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種
#附帶后綴只是上述三種規(guī)則的細微變化
#TinkPHP框架核心代碼獲取到以上三種模式的參數(shù)后
#會進行特定的處理 帶不帶后綴 帶哪種后綴 均可配置
#也就是如下幾種規(guī)則
htt://www.jb100.net/index.php/Info/usrInfo.html
#第二種
htt://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
簡單點理解,,上述格式化的url形式就是ThinkPHP需要支持的pathinfo路徑模式,。對這個種格式化的url進行稍微解釋,訪問這個么一個地址,,對基于ThinkPHP框架的網(wǎng)站來說,,實際需要執(zhí)行的就是網(wǎng)站根目錄下的index.php文件,而該url中后面的/Usr/UsrInfo則被作為mvc思路中的功能模塊參數(shù)與控制器參數(shù),,轉(zhuǎn)換為普通get方式傳參則上述url就要變?yōu)椋?span>
http://www.jb100.net/index.php?m=Usr&a=UsrInfo
有了這種思路,nginx的url重寫就有了最原始的寫法了,,對于上述pathinfo的格式化url,,nginx在不做url重寫時會把它當做一個路徑來執(zhí)行,一般來說沒有誰會吃多了撐得在網(wǎng)站根目錄下建立一個名字叫index.php的目錄(注意:是目錄,,不是一般意義上的文件),,所以第一種url重寫出現(xiàn)了:
#一下是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;
}
}
但問題出現(xiàn)了,基于ThinkPHP的應用不僅僅只有上述例子中的這種pathinfo模式,,現(xiàn)在變成這樣的了:(為了便于解說,,稱如下代碼段為“url示例”,后方提到“url示例”就是指此處的三種url格式)
#第一種,,未隱藏index.php 但url路徑中有.html后綴
http://www.jb100.net/index.php/Usr/UsrInfo.html
#第二種,,隱藏腳本文件index.php
http://www.jb100.net/Usr/UsrInfo
或
http://www.jb100.net/Usr/UsrInfo/
#第三種,需要在訪客看到的網(wǎng)址中隱藏掉index.php,,且?guī)?html后綴
http://www.jb100.net/Usr/UsrInfo.html
#ThinkPHP可以處理的傳參形式
http://www.jb100.net/index.php?s=/Usr/UsrInfo
所以又一種nginx的url重寫出現(xiàn)了:
location / {
root /var/www;
index index.html index.htm index.php;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
}
那么,,現(xiàn)在需要同時兼容上述url示例中的三種格式又出問題了,。最后解決方法如下:
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;
}
}