问号在htaccess URL Rewrite中如何匹配?
比如这样一个地址链接 a.html?b=1
,如果我们想把它rewrite成 c.html?d=1
,起初我是想通过这样的写法来匹配url中的问号:
RewriteRule ^a\.html?b=([0-9]+)$ /c.html?d=$1 [L,NC]
试验证明这样是不行的。
我尝试过很多种方式来匹配问号,比如: ?
, \?
, [?]
, [?]{1,1}
, [\?]
,都不好用。
原因在于我错误的理解了htaccess URL Rewrite的匹配工作原理。请看下图:
RewriteRule中的 Pattern
部分并不是指的整个URL,而是单纯的问号前面的部分,而且不包含域名(也不包含最前面的一个/
)。
为了便于理解,我暂且把问号前面的部分叫:问前地址
,问号后面的部分叫:参数部分
。
如果 Pattern
规则能匹配问前地址
,则整个地址里的问前地址
部分就会被 Substitution
替换掉,原地址后面的参数部分
不变。
如果 Substitution
里含有问号,也就是说它本身带了参数,则抛弃原有地址后面的参数,使用 Substitution
里的参数。
总之,Pattern
部分里是没有问号的。它指的是问号前面、域名后面的那部分地址。
如果我们想在htaccess URL Rewrite里校验参数部分
,有什么办法?可以使用 %{QUERY_STRING}
内置变量。
RewriteCond %{QUERY_STRING} b=([0-9]+) [NC] RewriteRule ^a\.html$ /c.html?d=%1 [L,NC]
注意,RewriteCond 里的正则表达式捕捉数据要通过 %
符号获取向后引用。 而 RewriteRule 里的则需要使用 $
符号获取。
阅读余下内容