mod_alias 重定向添加两个尾部斜杠

mod_alias redirects adding two trailing slashes

我有许多 URL 可以输入或不带尾部斜线。它们被用作虚荣 URLs.

.htaccess 看起来像这样:

Redirect 301 /folder/vanity1 http://example.com/differentfolder/
Redirect 301 /folder/vanity2 http://example.com/a/third/folder/
Redirect 301 /vanity3 http://example.com/fourth/folder/

用户输入:

http://example.com/folder/vanity1
http://example.com/folder/vanity2
http://example.com/vanity3
http://example.com/folder/vanity1/
http://example.com/folder/vanity2/
http://example.com/vanity3/

当用户在没有尾部斜杠的情况下输入这些内容时,重定向工作正常,最终在 http://example.com/differentfolder/ 处根据需要添加一个尾部斜杠。

问题:

当用户输入带有尾部斜杠的这些内容时,例如 http:/example.com/folder/vanity1/,他们会重定向到带有两个尾部斜杠的 URL,例如 http://example.com/differentfolder//,这会引发 404 错误。

我试过了:

  1. 从 .htaccess 中删除所有其他行,除了这三个虚荣 URL 和保持网站正常运行所需的标准 WordPress 块。 WordPress 块出现在文件的最后:

# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress

我不仅检查了我的浏览器,还检查了 WebConfs HTTP Header 检查以确保我没有看到缓存的规则。还是一样,如果你输入一个没有尾部斜杠的虚荣 URL 它会起作用;如果你用一个尾部斜杠输入它,它会重定向到两个尾部斜杠,这会导致 404.

  1. 在我的规则中添加尾部斜线:

Redirect 301 /folder/vanity1/ http://example.com/differentfolder/

如果用户键入尾部斜杠,这会正常工作,但如果他们不输入斜杠,它不会重定向和 404,因为 URL http://example.com/folder/vanity1/ 实际上并不存在。

问题:

是否有不同的方式将虚荣心 URL 重定向到只有一个尾部斜杠的最终目的地,无论访问者以何种方式输入虚荣心 URL - 有或没有尾部斜杠?

Redirect

中所述

Additional path information beyond the matched URL-path will be appended to the target URL.

这意味着 /folder/vanity1 仅用作前缀,并且请求的 URL 中的附加斜线或任何其他内容将附加到目标,例如http://example.com/folder/vanity1/hi/there 会导致 http://example.com/differentfolder//hi/there

如果要精确匹配这两个 URL,/folder/vanity1/folder/vanity1/,您必须使用 RedirectMatch or mod_rewrite


使用 RewriteRule 看起来像

RewriteRule ^folder/vanity1/?$ /differentfolder/ [R,L]

由于 /?,此模式匹配带或不带尾部斜线,表示可选斜线。其他规则看起来类似。

当一切正常时,您可以将 R 替换为 R=301 (permanent redirect). Never test with R=301.


RedirectMatch,看起来几乎一样

RedirectMatch ^/folder/vanity1/?$ /differentfolder/

同样的免责声明适用于此,当它按预期工作时,您可以将状态代码设置为 301