.htaccess Redirect 301 with trailing slash 将尾部斜线添加到目标

Chr*_*row 4 .htaccess redirect

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

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

Redirect 301 /example /example.php
Run Code Online (Sandbox Code Playgroud)

所以我添加了这个来解释尾部斜杠:

Redirect 301 /example/ /example.php
Run Code Online (Sandbox Code Playgroud)

但这会重定向到example.php/(向目标添加斜杠,这不起作用)

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

MrW*_*ite 5

但这会重定向到 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
Run Code Online (Sandbox Code Playgroud)

但是,该Redirect指令实际上并不是此处使用的正确指令,因为您需要两个指令来处理此问题。(一般情况下,用Redirect指令,则需要包含或排除在结尾的斜线源和目标URL)。

您可以改用该RedirectMatch指令,它使用正则表达式匹配。例如,要处理有和没有尾部斜杠:

RedirectMatch 301 ^/example/?$ /example.php
Run Code Online (Sandbox Code Playgroud)

这仅匹配/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]
Run Code Online (Sandbox Code Playgroud)

请注意,在使用时,RewriteRule 模式上没有斜杠前缀,.htaccess因为模式匹配的 URL 路径已经删除了目录前缀(总是以斜杠结尾)。

另请注意,每个模块中指令的顺序可能很重要。

旁白:如果您的网站已经“重做”,为什么表单的“新”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]
Run Code Online (Sandbox Code Playgroud)

(我还删除了RewriteRule 替换上的斜杠前缀,现在不需要,因为我们正在重写文件系统路径。)

如果您/example在 HTML 源代码中提供链接,则用户不会意识到该请求确实映射到example.php.