2012-07-27 52 views
0
RewriteRule ^resources/.+$ - [L] 

RewriteRule .? index.php?t=$0 [QSA,L] 

請求將產生500 - Internal Server Error,因爲它會一次又一次重複同樣的規則,由於其作爲第一個準確地處理內部重定向的請求。這將導致index.php?t=index.php&t=index.php&t=index.php&[...infinite more...]&t=test.php忽略來自內部重定向

無限鏈,但在我看來,這不是更好:

RewriteRule ^resources/.+$ - [L] 

RewriteCond %{QUERY_STRING} !t= 
RewriteCond %{REQUEST_URI} !^index\.php$ 
RewriteRule .? index.php?t=$0 [QSA,L] 

因爲現在用戶可以輸入index.php?t=test.php如地址,會通過腳本,並得到了相同的內容,如果他給了test.php。我不喜歡那樣。

那麼我該如何執行第一個沒有重複內部重定向的問題呢?
當然,一個標誌VL - 非常最後會做的伎倆,但遺憾的是它不存在。

回答

0

首先我們看看給出規則的所有參數,可能表明這是否是鏈接請求。這意味着,我們或者1)需要鏈接請求中的變量而不是相對於改變的URI或者2)相反,與變化的URI相關並且沒有改變的變量(因爲我們可以將其與其他人chad)確實是 chage)。

問題是,他們幾乎都根據應用的RewriteRules更新。

IS_SUBREQ(1)和THE_REQUEST(2)是唯一的變量有趣但不幸的內部重定向不被視爲子請求,所以IS_SUBREQ消失。只有THE_REQUEST不會更改,並且包含真實的給定路徑,所以我們找到了我們的入口點。

考慮到這一點這裏是討厭複雜的解決方案:

RewriteEngine On 

# Set SCRIPT_URI and SUBREQ 
# MUST be the first statements in the file 
# SCRIPT_URI is the original browser-requested path 
# SUBREQ is "true" if the original browser-requested path is not overriden yet 

RewriteCond %{ENV:REQUEST_PARSED} !true 
RewriteCond %{THE_REQUEST} ^\s*\w+\s+(http://[^\s/]+/|/?)([^\s\?]*)[\s\?$] 
RewriteRule .? - [E=SCRIPT_URI:/%2,C] 
RewriteRule .? - [E=REQUEST_PARSED:true] 

RewriteCond %{ENV:SCRIPT_URI} ^(.*?)/\.($|/.*$) 
RewriteRule .? - [E=SCRIPT_URI:%1%2,N] 

RewriteCond %{ENV:SCRIPT_URI} ^(.*?)/[^/]+/\.\.($|/.*$) 
RewriteRule .? - [E=SCRIPT_URI:%1%3,N] 

RewriteCond %{ENV:SCRIPT_URI} ^(.*?)//\.\.($|/.*$) 
RewriteRule .? - [E=SCRIPT_URI:%1/%2,N] 

RewriteCond %{ENV:SCRIPT_URI}#%{REQUEST_URI} !^/*(.*)#/*\1$ 
RewriteRule .? - [E=SUBREQ:true] 

# SCRIPT_URI and SUBREQ are set now. Actual content follows: 

RewriteCond %{ENV:SUBREQ} !true 
RewriteRule ^resources/.+$ - [L] 

RewriteCond %{ENV:SUBREQ} !true 
RewriteRule .? index.php?t=$0 [QSA,L]