忽略来自内部重定向

问题描述:

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 - 非常最后会做的伎俩,但遗憾的是它不存在。

首先我们看看给出规则的所有参数,可能表明这是否是链接请求。这意味着,我们或者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]