首先,我们看一下赋予规则的所有参数,这些参数可能表明这是否是一个链式请求。这意味着,我们要么 1)需要在链式请求中更改的变量与更改后的 URI 无关,或者 2)相反,一个与更改后的 URI 相关且未更改的变量(因为我们可以将它与其他确实改变了)。
问题是,它们几乎都根据应用的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]