Web开发 Web开发 关注:11 内容:7

htaccess URL Rewrite中的问号如何匹配

  • 查看作者
  • 打赏作者
  • 当前位置: F12开发者 > Web开发 > 正文
    • Web开发
    • Lv.9
      超凡入圣
      官方

      比如这样一个地址链接 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的匹配工作原理。请看下图:

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

      htaccess URL Rewrite中的问号如何匹配

      请登录之后再进行评论

      登录
    • 发表内容
    • 实时动态
    • 偏好设置
    • 帖子间隔 侧栏位置: