代码之家  ›  专栏  ›  技术社区  ›  Frank Farmer

重写规则与单引号字符不匹配

  •  1
  • Frank Farmer  · 技术社区  · 16 年前

    我之前问过这个问题:

    mod_rewrite: match only if no previous rules have matched?

    并已成功使用建议的解决方案一段时间:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{THE_REQUEST} ^.+\ (/[^?\s]*)\??([^\s]*)
    RewriteCond %{REQUEST_URI}?%{QUERY_STRING}<%1?%2 ^([^<]*)<\1$
    RewriteRule .* /pub/dispatch.php [L]
    

    然而,我们发现这个规则对于包含单引号字符的URL是失败的,例如。 http://example.com/don't_do_it (实际要求如下 http://example.com/don%27t_do_it )

    具体来说,这是不匹配的行:

    RewriteCond %{REQUEST_URI}?%{QUERY_STRING}<%1?%2 ^([^<]*)<\1$
    

    将其注释掉会导致规则按预期匹配,但会破坏“仅当以前的规则没有匹配时才匹配”行为。这可能与以下事实有关: ' urlencoded为 %27 .

    这是相关的rewritelog条目(用于URL /asdf'asdf 又名 /asdf%27asdf ):

     RewriteCond: input='/asdf'asdf?</asdf%27asdf?' pattern='^([^<]*)<\1$' => not-matched
    

    我在这里看到的是,%请求uri是未捕获的,而%查询字符串是转义的,因此不匹配。是否有其他方法可以替代我应该使用的方法之一?

    任何关于如何重写上述行的想法,以便它也将匹配包含 字符?

    3 回复  |  直到 16 年前
        1
  •  0
  •   Gumbo    16 年前

    试试 C flag 把你只想应用的规则的序列连接起来。所以实际上,把你所有的规则都连锁起来。

        2
  •  0
  •   DrDol    16 年前

    您可以在重写器的末尾测试[ne]标志。

        3
  •  0
  •   Frank Farmer    16 年前

    打了很长一段时间后,事情看起来很好:

    RewriteMap unescape int:unescape
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{THE_REQUEST} ^.+\ (/[^?\s]*)\??([^\s]*)
    RewriteCond %{REQUEST_URI}?%{QUERY_STRING}<${unescape:%1}?%2 ^([^<]*)<\1$
    RewriteRule .* /pub/dispatch.php [L]
    
    推荐文章