忽略来自内部重定向
问题描述:
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]