.htaccess 重定向 301 带尾斜杠将尾斜杠添加到目标

.htaccess 重定向 301 带尾斜杠将尾斜杠添加到目标

我刚刚重新设计了我的网站,并尝试在 .htaccess 文件中为已更改的链接设置重定向

这工作正常,但它不适用于/example/(源路径上带有尾部斜杠)

Redirect 301 /example /example.php

因此我添加了这个来解释尾随的斜杠:

Redirect 301 /example/ /example.php

但这会重定向到example.php/(在目的地后面添加一个斜杠,这是不起作用的)

显然我做错了。有什么更好的方法吗?

答案1

但这会重定向到example.php/

这是由第一条(原始)规则引起的。请注意,较早的(错误)301 很可能已被浏览器缓存。使用 302(临时)重定向进行测试以避免潜在的缓存问题。

Redirect指令是前缀匹配(整个路径段),匹配后的所有内容都附加到目标 URL 的末尾。因此,第一个指令重定向:

  • /example/example.php
  • /example//example.php/
  • /example/abc/example.php/abc

如果指令按如下顺序排列,那么它们应该对发布的两个示例 URL 有效:

Redirect 301 /example/ /example.php
Redirect 301 /example /example.php

但是,该Redirect指令实际上并不是此处要使用的正确指令,因为您需要两个指令来处理此问题。(通常,使用该Redirect指令,您需要在两个都源 URL 和目标 URL。

您可以改用RedirectMatch使用正则表达式匹配的指令。例如,要处理带有和不带有尾部斜杠的情况:

RedirectMatch 301 ^/example/?$ /example.php

这仅匹配/example/example/并重定向到/example.php

Redirect并且RedirectMatch都是 mod_alias 的一部分。

但是,如果你已经在使用 mod_rewrite,那么请考虑使用 mod_rewriteRewriteRule来避免潜在的冲突,因为 mod_rewrite 总是运行mod_alias,尽管 中的指令顺序明显不同.htaccess。例如:

RewriteEngine On

RewriteRule ^example/?$ /example.php [R=301,L]

请注意,RewriteRule 图案当使用在.htaccessURL 路径中时图案匹配的目录前缀(总是结束带有斜线)被删除。

还要注意,每个模块内的指令的顺序也很重要。

在旁边:如果你已经“重新设计”了网站,为什么“新”的 URL 形式是这样的/example.php?这似乎有点落后?


更新:我请人将原来的 wordpress 网站转换为(几乎)等效的网站,该网站仅使用 HTML 和少量 javascript 和 php

您可以保留原始的 WordPress URL(例如/example)和内部重写将请求发送到处理该请求的底层文件(即example.php),而不是外部重定向。为此,您需要使用 mod_rewrite。您还需要在 HTML 源代码中链接到“旧”WordPress URL。例如/example(并考虑规范化尾部斜杠 - 重定向到其中一个)。

内部重写 /example(或/example//example.php您只需R从上面的RewriteRule指令中删除标志即可。例如:

RewriteRule ^example/?$ example.php [L]

(我还删除了RewriteRule 代换,由于我们正在重写文件系统路径,所以现在不需要这样做。)

在您的 HTML 源代码中提供链接到,/example那么用户并不知道请求实际上已映射到example.php

相关内容