我正在尝试用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参数。
https://example.com/page.html?market=value&store=value
market
store
dfuffjeb1#
RewriteRule ^/page.html /page.html?market=new-value [R=301,L,NC]
请注意,当在.htaccess中使用时,RewriteRulepattern 匹配的URL路径不以斜杠开头,因此上面使用的正则表达式^/page.html在此上下文中永远不会匹配。请尝试以下方法:
.htaccess
RewriteRule
^/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参数 * 值 * 的部分(包括参数名称本身)。这些部分保存在以下反向引用中:
market=value
%1
(.*&)?
&
%2
(market=)
market=
%3
(&.*)?
REQUEST_URI
new-value
value
NE(noescape)标志是必需的,以防止&(URL参数分隔符)在响应中被URL编码。注意,我从RewriteCond和RewriteRule指令中删除了NC(nocase)标志。URL参数名称通常不区分大小写,此规则(如所写)将保留请求中使用的大小写。首先使用302(临时)重定向进行测试,以避免潜在的缓存问题,即使您稍后将其更改为永久重定向。在测试之前,您需要清除浏览器缓存,因为之前的301(永久)重定向已经被浏览器缓存。
NE
noescape
RewriteCond
NC
nocase
1条答案
按热度按时间dfuffjeb1#
请注意,当在
.htaccess
中使用时,RewriteRule
pattern 匹配的URL路径不以斜杠开头,因此上面使用的正则表达式^/page.html
在此上下文中永远不会匹配。请尝试以下方法:
这将在查询字符串中的任何位置查找
market=value
URL参数名称/值对。我们捕获查询字符串中围绕market
URL参数 * 值 * 的部分(包括参数名称本身)。这些部分保存在以下反向引用中:%1
/ pattern(.*&)?
-market
URL参数(如果有)* 之前 * 的查询字串部分。这包括market
URL参数名称之前的&
分隔符号。%2
/ pattern(market=)
-捕获文本market=
。这必须匹配才能成功。这只是为了避免以后重复。%3
/ pattern(&.*)?
-market
URL参数(如果有)* 之后 * 的查询字串部分。这包括market
URL参数值之后的&
分隔符号。REQUEST_URI
服务器变量包含完整的根目录相对URL路径。我们在此之后使用如上所述的反向引用重新构建查询字符串,注入new-value
作为market
URL参数的值(替换此URL参数最初的value
)。NE
(noescape
)标志是必需的,以防止&
(URL参数分隔符)在响应中被URL编码。注意,我从
RewriteCond
和RewriteRule
指令中删除了NC
(nocase
)标志。URL参数名称通常不区分大小写,此规则(如所写)将保留请求中使用的大小写。首先使用302(临时)重定向进行测试,以避免潜在的缓存问题,即使您稍后将其更改为永久重定向。在测试之前,您需要清除浏览器缓存,因为之前的301(永久)重定向已经被浏览器缓存。