替换URL中具有查询字符串的一个参数并保留其他参数



我正在尝试用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=valueURL参数名称/值对。我们捕获查询字符串中围绕marketURL参数的部分(包括参数名称本身(。这些保存在以下回溯参考中:

  • %1/pattern(.*&)?-查询字符串marketURL参数(如果有(之前的部分。这包括marketURL参数名称之前的&分隔符
  • %2/模式(market=)-捕获文本market=。这必须匹配才能成功。这只会节省以后的重复
  • %3/模式(&.*)?-查询字符串marketURL参数(如果有(之后的部分。这包括marketURL参数值之后的&分隔符

替换字符串中的REQUEST_URI服务器变量包含完整的根相对URL路径。接下来,我们使用如上所述的backreferences重建查询字符串,注入new-value作为marketURL参数的值(替换该URL参数最初的value(。

需要NE(noescape(标志来防止&(URL参数分隔符(在响应中被URL编码。

注意,我从RewriteCondRewriteRule指令中删除了NC(nocase(标志。URL参数名称通常不区分大小写,此规则(如所写(将保留请求中使用的大小写。

首先使用302(临时(重定向进行测试,以避免潜在的缓存问题,即使稍后将其更改为永久重定向也是如此。在测试之前,您需要清除浏览器缓存,因为之前的301(永久(重定向将由浏览器缓存。

最新更新