我正在尝试用Apache重写来替换URL参数值。
RewriteCond ℅{QUERY_STRING} market=value [NC]
RewriteRule ^/page.html /page.html?market=new-value [R=301,L,NC]
URL模式为https://example.com/page.html?market=value&store=value
我只需要替换market
参数值,并按原样保留store
参数。
RewriteRule ^/page.html /page.html?market=new-value [R=301,L,NC]
请注意,在.htaccess
中使用时,RewriteRule
模式匹配的URL路径不会以斜杠开头,因此上面使用的正则表达式^/page.html
在此上下文中永远不会匹配。
请尝试以下操作:
RewriteCond %{QUERY_STRING} ^(.*&)?(market=)value(&.*)?$
RewriteRule ^/?page.html$ %{REQUEST_URI}?%1%2new-value%3 [NE,R=301,L]
这将在查询字符串中的任何位置查找market=value
URL参数名称/值对。我们捕获查询字符串中围绕market
URL参数值的部分(包括参数名称本身(。这些保存在以下回溯参考中:
%1
/pattern(.*&)?
-查询字符串在market
URL参数(如果有(之前的部分。这包括market
URL参数名称之前的&
分隔符%2
/模式(market=)
-捕获文本market=
。这必须匹配才能成功。这只会节省以后的重复%3
/模式(&.*)?
-查询字符串中market
URL参数(如果有(之后的部分。这包括market
URL参数值之后的&
分隔符
替换字符串中的REQUEST_URI
服务器变量包含完整的根相对URL路径。接下来,我们使用如上所述的backreferences重建查询字符串,注入new-value
作为market
URL参数的值(替换该URL参数最初的value
(。
需要NE
(noescape
(标志来防止&
(URL参数分隔符(在响应中被URL编码。
注意,我从RewriteCond
和RewriteRule
指令中删除了NC
(nocase
(标志。URL参数名称通常不区分大小写,此规则(如所写(将保留请求中使用的大小写。
首先使用302(临时(重定向进行测试,以避免潜在的缓存问题,即使稍后将其更改为永久重定向也是如此。在测试之前,您需要清除浏览器缓存,因为之前的301(永久(重定向将由浏览器缓存。