0
RewriteRule ^resources/.+$ - [L]

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

会产生 a 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 - Very Last可以解决问题,但遗憾的是它不存在。

4

1 回答 1

0

首先,我们看一下赋予规则的所有参数,这些参数可能表明这是否是一个链式请求。这意味着,我们要么 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]    
于 2012-07-27T15:57:55.900 回答