【发布时间】:2011-07-31 06:34:22
【问题描述】:
今天早些时候,我正在帮助某人处理 .htaccess 用例,came up with a solution 可以工作,但我自己却搞不清楚!
他希望能够:
- 浏览至
index.php?id=3&cat=5 - 查看地址栏阅读
index/3/5/ - 从
index.php?id=3&cat=5提供内容
最后两个步骤是相当典型的(通常是用户首先输入index/3/5),但第一步是必需的,因为他的站点中仍然有一些旧格式的链接,并且无论出于何种原因,无法不要改变它们。所以他需要支持两种 URL 格式,并让用户最终看到的是美化的。
经过反复折腾,我们想出了以下.htaccess 文件:
RewriteEngine on
# Prevents browser looping, which does seem
# to occur in some specific scenarios. Can't
# explain the mechanics of this problem in
# detail, but there we go.
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]
# Hard-rewrite ("[R]") to "friendly" URL.
# Needs RewriteCond to match original querystring.
# Uses "?" in target to remove original querystring,
# and "%n" backrefs to move its components.
# Target must be a full path as it's a hard-rewrite.
RewriteCond %{QUERY_STRING} ^id=(\d+)&cat=(\d+)$
RewriteRule ^index\.php$ http://example.com/index/%1/%2/? [L,R]
# Soft-rewrite from "friendly" URL to "real" URL.
# Transparent to browser.
RewriteRule ^index/(\d+)/(\d+)/$ /index.php?id=$1&cat=$2
虽然这似乎是一个有点奇怪的用例(“为什么不首先使用正确的链接?”,您可能会问),但还是照做吧。不管最初的要求是什么,这就是场景,它让我发疯。
没有第一条规则,客户端进入请求循环,反复尝试GET /index/X/Y/,每次都得到302。对REDIRECT_STATUS 的检查使一切顺利进行。但我会认为,在最终规则之后,将不再提供任何规则,客户端不会再提出任何请求(注意,不是 [R]),一切都将是肉汁。
那么...为什么当我取出第一条规则时会导致请求循环?
【问题讨论】:
-
在我看来一点也不奇怪