apache - 如何重定向和显示具有相同 url 的内容?

标签 apache .htaccess mod-rewrite url-rewriting

我有一个可能很简单的问题。我有几个 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规则详解:

  • 现在进入条件解释部分:在 RewriteRuleRewriteRule ^(.*)/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/

相关文章:

asp.net - mod_mono 和 Apache 上的 Appdomain 回收设置

php - Apache 在测试服务器上设置多个项目

ssl - httpd.conf 和 ssl.conf 的区别

apache - VirtualDocumentRoot 处理不存在的文件夹

php - 使用 htaccess 从 URL 中删除文件夹名称

apache - .htaccess - RewriteCond : bad flag delimiters

.htaccess - 如何在 litespeed 服务器上的 url 中隐藏 index.php

regex - codeigniter 301 使用路由器重定向旧 url 并且没有重定向

apache - 为什么我的 javascript 和 css 没有缓存?

php - .htaccess 指向页面的 php 版本(如果存在)