【问题标题】:Apache mod_rewrite preserving query string and adding anchorApache mod_rewrite 保留查询字符串并添加锚点
【发布时间】:2023-03-22 13:17:01
【问题描述】:

我想创建一个重定向此的 mod_rewrite 规则: www.domain.com/original/

为此添加一个锚点: www.domain.com/new/#something-else

它还应该保留原始 URL 中指定的任何查询字符串(如果存在)。例如: www.domain.com/original/?key=example

应该重定向到: www.domain.com/new/?key=example#something-else

我尝试使用以下带有 NE 和 QSA 标志的 mod_rewrite 规则,即使它保留了锚点和查询字符串,它们也以错误的顺序重写:查询字符串 after 锚点而不是之前.

RewriteRule ^original https://%{HTTP_HOST}/new/$1#something-else [QSA,NE,R=301,L]

如何保留原始查询字符串(如果存在)并将锚附加到末尾?

谢谢

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    如何保留原始查询字符串(如果存在)并将锚附加到末尾?

    除非您在重定向中修改查询字符串,否则不需要标记 QSA,因此可以在此处省略。

    您的规则中无需使用https://%{HTTP_HOST},因为源域和重定向域相同。

    $1 将为空,因为您没有在模式中捕获任何文本。

    您可以使用此重定向规则:

    # when query string is non-empty
    RewriteCond %{QUERY_STRING} .
    RewriteRule ^original/?$ /new/?%{QUERY_STRING}#something-else [NC,NE,R=302,L]
    
    # when query string is empty
    RewriteRule ^original/?$ /new/#something-else [NC,NE,R=302,L]
    

    一旦您确认它工作正常,请将 R=302 替换为 R=301(永久重定向)

    【讨论】:

    • 使用R=302 临时重定向开始测试可能是有意义的,只有在您确定一切都按预期工作时才将其更改为R=301 永久重定向。
    • 感谢您的回复,但这不起作用。重定向最终为 /new/#something-else?query_string,这不是一个有效的 URL。锚点应始终查询字符串之后,例如/new/?query_string#something-else。有没有办法强制 mod_rewrite 以正确的顺序放置这些元素?
    • 好的,你可以试试:RewriteRule ^original/?$ /new/?%{QUERY_STRING}#something-else [NC,NE,R=302,L]
    • 谢谢,这样效果更好,但仍然存在一个问题:查询字符串应该是可选的,如果传入 URL 中没有指定查询字符串,则它目前以 /new/?#something-else 结尾。我怎样才能摆脱“?”什么时候没有指定查询字符串?
    猜你喜欢
    • 2021-06-28
    • 2018-05-11
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    相关资源
    最近更新 更多