regex .htaccess从URL中删除特定的查询字符串部分并重定向具有相同值的查询字符串

uxh89sit  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(167)

我想使用.htaccess将带有查询字符串的URL重定向到另一个查询字符串,同时删除From URL中第一个查询字符串之后的&anyParameterName=anyValue
&anyParameterName=anyValue可以是任何东西。
如果有人访问https://example.com/?id=123456&anyParameterName=anyValue,首先htaccess应该从URL中删除&anyParameterName=anyValue部分,然后按如下所示重定向。

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

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

RewriteEngine on
RewriteCond %{QUERY_STRING} ^id=([0-9]+)$ [NC]
RewriteRule ^$ /?p=%1 [R=301,L]
osh3o9ms

osh3o9ms1#

这实际上只是earlier question的扩展。
如果有人访问https://example.com/?id=123456&anyParameterName=anyValue首先htaccess应该从URL中删除&anyParameterName=anyValue部分,然后按如下所示重定向。
您可能对这个问题的想法是错误的。与其“首先删除其他参数”,您只需要确保您匹配id URL参数,而不管查询字符串中是否有其他URL参数。目前,您正在匹配仅由id URL参数组成的查询字符串。您在 substitution 字符串中构造的新URL(RewriteRule指令的第二个参数)则只设置您感兴趣的URL参数。
您现有的 * 条件 * 捕获id URL参数的值:

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

尾部的$是字符串结尾锚,所以它只在id=<number>出现在查询字符串的结尾时匹配。(同样,^只在id=<number>出现在查询字符串的开头时匹配。换句话说,正则表达式只在id=<number>是查询字符串中唯一的URL参数时匹配。)
您需要匹配字符串的结尾,或者一个&来分隔下一个URL参数。例如:

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

$|&部分是regex alternation。由|(管道符号)分隔的部分之一必须匹配。周围的圆括号包含此regex标记(但也使其成为捕获组)。
现在,查询字符串中id=<number> URL参数后面的任何URL参数都将被丢弃。
如果你还想丢弃任何可能出现在id参数之前的URL参数,那么你需要在正则表达式的开头添加类似的东西。在这种情况下,它可以是^(字符串开头)或&(URL参数分隔符)。例如:

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

这里的一个小补充是左括号后的?:。这使得捕获组(由周围的括号表示)* 非捕获 *,因此我们仍然可以在 substitution 字符串中使用%1(而不是%2)来引用id URL参数值。
完整的规则变成:

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

\d(简写字符类)与[0-9]相同。
注意:您应该首先使用302(临时)重定向进行测试,并确保在测试前清除浏览器缓存。
不用说,这个规则需要放在根.htaccess文件的顶部附近。

相关问题