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

修改:仅当以前的规则没有匹配时才匹配?

  •  0
  • Frank Farmer  · 技术社区  · 15 年前

    我有一大套重写规则,如下所示:

    RewriteRule ^foo foo.php?blah [L]
    RewriteRule ^bar foo.php?baz [L]
    

    然后我有了一种我只想在上面的规则不匹配的情况下应用的“捕获所有”规则(例如 /blatz )只要我记得包括 [L] 很好,但我已经两次不小心忘记了。

    有什么简单的方法可以迫使我的“一网打尽”规则 不匹配 如果先前的规则匹配? (理想情况下,每一条规则都不附加任何内容)

    1 回复  |  直到 15 年前
        1
  •  1
  •   Gumbo    15 年前

    我能想象的唯一解决方案是使用 S 跳过最后一条规则的标志:

    RewriteRule ^foo foo.php?blah [L,S=999]
    RewriteRule ^bar foo.php?baz [L,S=999]
    RewriteRule …
    

    或设置环境变量:

    RewriteRule ^foo foo.php?blah [L,E=FLAG:1]
    RewriteRule ^bar foo.php?baz [L,E=FLAG:1]
    RewriteCond %{ENV:FLAG} ^$
    RewriteRule …
    

    编辑 ____好吧,这里是_另一个将当前URL与最初请求的URL进行比较的解决方案:

    RewriteCond %{THE_REQUEST} ^[A-Z]+\ (/[^?\s]*)\??([^\s]*)
    RewriteCond %{REQUEST_URI}?%{QUERY_STRING}<%1?%2 ^([^<]*)<\1$
    RewriteRule …
    

    但我认为这至少需要Apache2,因为Apache1.x使用posix-ere和posix-ere不支持 \ n 模式中的回溯引用。

    推荐文章