Apache mod_rewrite 保留查询字符串并添加锚点

问题描述

我想创建一个重定向这个的 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]

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

谢谢

解决方法

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

除非您在重定向中修改查询字符串,否则不需要标志 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,L]

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