问号在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 里的则需要使用 $ 符号获取。

阅读余下内容
 

发表评论

电子邮件地址不会被公开。 必填项已用*标注


京ICP备12002735号