• 注册
  • Web开发 Web开发 关注:10 内容:6

    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中的问号如何匹配

    请登录之后再进行评论

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