我想使用.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]
1条答案
按热度按时间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参数的值:尾部的
$
是字符串结尾锚,所以它只在id=<number>
出现在查询字符串的结尾时匹配。(同样,^
只在id=<number>
出现在查询字符串的开头时匹配。换句话说,正则表达式只在id=<number>
是查询字符串中唯一的URL参数时匹配。)您需要匹配字符串的结尾,或者一个
&
来分隔下一个URL参数。例如:$|&
部分是regex alternation。由|
(管道符号)分隔的部分之一必须匹配。周围的圆括号包含此regex标记(但也使其成为捕获组)。现在,查询字符串中
id=<number>
URL参数后面的任何URL参数都将被丢弃。如果你还想丢弃任何可能出现在
id
参数之前的URL参数,那么你需要在正则表达式的开头添加类似的东西。在这种情况下,它可以是^
(字符串开头)或&
(URL参数分隔符)。例如:这里的一个小补充是左括号后的
?:
。这使得捕获组(由周围的括号表示)* 非捕获 *,因此我们仍然可以在 substitution 字符串中使用%1
(而不是%2
)来引用id
URL参数值。完整的规则变成:
\d
(简写字符类)与[0-9]
相同。注意:您应该首先使用302(临时)重定向进行测试,并确保在测试前清除浏览器缓存。
不用说,这个规则需要放在根
.htaccess
文件的顶部附近。