我有一个可能很简单的问题。我有几个 URL 需要以这种方式重定向:
如果调用 URL“/abc/”,它应该显示位于“xyz.html”下的内容
我可以用
RewriteRule abc$ xyz.html
但是“xyz.html”应该是 301 重定向到“/abc”,如果它被调用的话。
这是我几个小时以来一直在寻找解决方案的简单问题。
如果它像 "test.html"和/test/就很容易了。我可以这样做
RewriteRule ^(.+)\.html$ /$1 [L,R=301]
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule !.*\.html$ %{REQUEST_URI}.html [END]
但在我的例子中,我有一堆没有模式的 URL。
我尝试的所有结果都是服务器配置错误。 你能帮我做一个 sample 吗?
谢谢你了
最佳答案
能否请您尝试以下。
RewriteEngine ON
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} ^/abc/? [NC]
RewriteRule ^(.*) /xyz.html [L]
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} ^/xyz\.html/? [NC]
RewriteRule ^(.*) /abc/? [R=301,L]
详细解释:
为什么有正常规则编写的重定向循环: 来自 OP 的问题很有趣且自相矛盾(有点),为什么因为假设我们写了第一个规则来重定向(在后端)从 abc
url 到 xyz.html
它会正常工作。但是当我们编写第二条规则时,将 url 从 xyz.html
重写为 abc/
,这与第一条规则正好相反。因此它变成了一个循环,ASAP 1st rules gets serve it extends to 2nd rule and it serves it back to 1st rule thus a REDIRECTION INFINITE LOOP (til 50 cycles or so).
如何防止重定向循环?
首先因为两个规则刚好相反所以写正常的规则会变成一个循环,现在我们怎么防止它变成一个循环呢?答案是使用:
RewriteCond
(在下一步解释)我使用了一个名为
ENV:REDIRECT_STATUS
的环境变量,它的值中包含任何重定向状态。关于这个变量,我们需要了解 2 件事。1- 没有任何请求重定向,其默认值为 NULL。
2- 每当我们进行成功的重定向时,它的值变为 200(非零),我们可以在我们的条件部分中使用它。
htaccess规则详解:
现在进入条件解释部分:在 RewriteRule
RewriteRule ^(.*)/xyz.html [L]
我没有在浏览器上重写 url 为什么因为我们始终希望向用户显示用户友好的 URL 的拇指规则,因此环境变量ENV:REDIRECT_STATUS
在这里将始终为零。现在进入第二个 RewriteRule
RewriteRule ^(.*)/abc/? [R=301,L]
用户已经在使用用户不友好的 URL,所以首先我需要在浏览器中将 URL 重写为用户友好的 url 因此R=301
(重定向这里使用永久标志)。一旦通过此条件发生重定向,第一个条件现在将开始失败,原因是因为它检查REDIRECT_STATUS
变量是否为 NULL,这不是在从第二个条件提供重定向后。因此,这就是它通过这个小技巧防止循环的方式:)
关于apache - 如何重定向和显示具有相同 url 的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64713415/