【问题标题】:mod_alias redirects adding two trailing slashesmod_alias 重定向添加两个斜杠
【发布时间】:2017-08-16 03:47:38
【问题描述】:

我有许多网址,可以输入或不输入斜杠。它们被用作虚 URL。

.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,例如引发 404 错误的 http://example.com/differentfolder//

我试过了:

  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 Check,以确保我没有看到缓存规则。还是一样,如果你输入一个没有斜杠的虚 URL,它就可以工作;如果你用一个斜杠键入它,它会重定向到两个斜杠,这会导致 404。

  1. 在我的规则中添加斜杠:

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

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

问题:

无论访问者在虚 URL 中输入哪种方式(带有或不带有尾部斜杠),是否有其他方法可以将虚 URL 重定向到仅带有一个尾部斜杠的最终目的地?

【问题讨论】:

    标签: .htaccess redirect mod-alias


    【解决方案1】:

    这工作如Redirect 中所述,

    匹配的 URL 路径之外的附加路径信息将附加到目标 URL。

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

    如果您想完全匹配这两个 URL,/folder/vanity1/folder/vanity1/,您必须使用 RedirectMatchmod_rewrite


    RewriteRule 看起来像

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

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

    当一切正常时,您可以将R 替换为R=301 (permanent redirect)。 从不R=301测试。


    加上RedirectMatch,看起来几乎一样

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

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

    【讨论】:

    • ^folder 应该是 ^/folder 因为 RedirectMatch 使用绝对路径。
    • 太棒了,感谢您澄清并提供两个选项。一个比另一个更有效吗?
    • @starkeen 谢谢你发现这个问题,已修复:-)
    • @WebElaine 我必须承认,我不知道。如果您对RedirectMatch 感到满意并且已经在使用mod_alias/Redirect,则可以节省一个额外的模块。
    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 2016-02-18
    • 1970-01-01
    • 2014-11-03
    • 2015-06-24
    • 1970-01-01
    • 2011-10-19
    • 2018-11-18
    相关资源
    最近更新 更多