.htaccess 从 URL 中删除特定的查询字符串部分,并使用相同的值重定向查询字符串

.htaccess remove specific query string part from URL and redirect query string with same value

提问人:ArunaLK 提问时间:4/21/2023 最后编辑:MrWhiteArunaLK 更新时间:4/21/2023 访问量:120

问:

我想将带有查询字符串的 URL 重定向到另一个查询字符串,同时使用 .htaccess 删除来自 URL 中的第一个查询字符串之后&anyParameterName=anyValue

&anyParameterName=anyValue可以是任何东西。

如果有人访问,首先htaccess应该从URL中删除该部分,然后重定向它,如下所示。https://example.com/?id=123456&anyParameterName=anyValue&anyParameterName=anyValue

发件人:(id= 之后的任意数字)https://example.com/?id=123456&anyParameterName=anyValue

收件人:(与发件人 URL 的 id= 中的数字相同)https://example.com/?p=123456

我有一个代码,但它没有删除选项(具有任何值的任何参数)anyParameterName=anyValue

RewriteEngine on
RewriteCond %{QUERY_STRING} ^id=([0-9]+)$ [NC]
RewriteRule ^$ /?p=%1 [R=301,L]
正则表达式 apache .htaccess mod-rewrite

评论

0赞 CBroe 4/21/2023
您正在尝试匹配包含 而不包含其他任何内容的查询字符串。因此,对于要重写的示例 URL,该条件不适用,因此不会发生重定向。id=...

答:

0赞 MrWhite 4/21/2023 #1

这实际上只是您之前问题的延伸。

如果有人访问,首先htaccess应该从URL中删除该部分,然后重定向它,如下所示。https://example.com/?id=123456&anyParameterName=anyValue&anyParameterName=anyValue

你可能以错误的方式思考这个问题。您只需要确保与 URL 参数匹配,而不必“首先删除其他参数”,而不管查询字符串中是否有其他 URL 参数。目前,您正在匹配仅包含 URL 参数的查询字符串。然后,您在替换字符串(指令的第二个参数)中构造的新 URL 仅设置您感兴趣的 URL 参数。ididRewriteRule

捕获 URL 参数值的现有条件id

RewriteCond %{QUERY_STRING} ^id=([0-9]+)$ [NC]

尾随是字符串末尾的定位点,因此它仅在出现在查询字符串末尾时匹配。(同样,唯一匹配的 when 位于查询字符串的开头。换言之,仅当正则表达式是查询字符串中唯一的 URL 参数时,它才匹配。$id=<number>^id=<number>

您需要匹配字符串末尾或分隔下一个 URL 参数的 a。例如:&

RewriteCond %{QUERY_STRING} ^id=([0-9]+)($|&) [NC]

该部分是正则表达式交替。由(管道符号)分隔的零件之一必须匹配。周围的括号将此正则表达式标记括起来(但也使其成为捕获组)。$|&|

现在,查询字符串中 URL 参数后面的任何 URL 参数都将被丢弃。id=<number>

如果您还想放弃参数之前可能出现的任何 URL 参数,那么您需要在正则表达式的开头使用类似的东西。在本例中,它是 (start-of-string) 或 (URL param 分隔符)。例如:id^&

RewriteCond %{QUERY_STRING} (?:^|&)id=([0-9]+)($|&) [NC]

这里的一个小补充是左括号之后。这使得捕获组(如周围括号所示)是非捕获的,因此我们仍然可以在替换字符串中使用(而不是)来引用 URL 参数值。?:%1%2id

然后,完整的规则变为:

RewriteCond %{QUERY_STRING} (?:^|&)id=(\d+)($|&) [NC]
RewriteRule ^$ /?p=%1 [R=301,L]

\d(简写字符类)与 相同。[0-9]

注意:您应该首先使用 302(临时)重定向进行测试,并确保在测试之前清除浏览器缓存。

毋庸置疑,此规则需要靠近根文件的顶部。.htaccess