提问人:ArunaLK 提问时间:4/21/2023 最后编辑:MrWhiteArunaLK 更新时间:4/21/2023 访问量:120
.htaccess 从 URL 中删除特定的查询字符串部分,并使用相同的值重定向查询字符串
.htaccess remove specific query string part from URL and redirect query string with same value
问:
我想将带有查询字符串的 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]
答:
这实际上只是您之前问题的延伸。
如果有人访问,首先htaccess应该从URL中删除该部分,然后重定向它,如下所示。
https://example.com/?id=123456&anyParameterName=anyValue
&anyParameterName=anyValue
你可能以错误的方式思考这个问题。您只需要确保与 URL 参数匹配,而不必“首先删除其他参数”,而不管查询字符串中是否有其他 URL 参数。目前,您正在匹配仅包含 URL 参数的查询字符串。然后,您在替换字符串(指令的第二个参数)中构造的新 URL 仅设置您感兴趣的 URL 参数。id
id
RewriteRule
捕获 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
%2
id
然后,完整的规则变为:
RewriteCond %{QUERY_STRING} (?:^|&)id=(\d+)($|&) [NC]
RewriteRule ^$ /?p=%1 [R=301,L]
\d
(简写字符类)与 相同。[0-9]
注意:您应该首先使用 302(临时)重定向进行测试,并确保在测试之前清除浏览器缓存。
毋庸置疑,此规则需要靠近根文件的顶部。.htaccess
评论
id=...