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

kjthegm6  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(174)

我正在尝试用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参数。

dfuffjeb

dfuffjeb1#

RewriteRule ^/page.html /page.html?market=new-value [R=301,L,NC]

请注意,当在.htaccess中使用时,RewriteRulepattern 匹配的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/ pattern (market=)-捕获文本market=。这必须匹配才能成功。这只是为了避免以后重复。
  • %3/ pattern (&.*)?-market URL参数(如果有)* 之后 * 的查询字串部分。这包括market URL参数值之后的&分隔符号。
  • substitution* 字符串中的REQUEST_URI服务器变量包含完整的根目录相对URL路径。我们在此之后使用如上所述的反向引用重新构建查询字符串,注入new-value作为market URL参数的值(替换此URL参数最初的value)。

NEnoescape)标志是必需的,以防止&(URL参数分隔符)在响应中被URL编码。
注意,我从RewriteCondRewriteRule指令中删除了NCnocase)标志。URL参数名称通常不区分大小写,此规则(如所写)将保留请求中使用的大小写。
首先使用302(临时)重定向进行测试,以避免潜在的缓存问题,即使您稍后将其更改为永久重定向。在测试之前,您需要清除浏览器缓存,因为之前的301(永久)重定向已经被浏览器缓存。

相关问题