匹配某个规则后结束Apache重写引擎

时间:2012-05-02 13:39:13

标签: apache .htaccess mod-rewrite

我试图重写我的启动文件的所有请求路径。像这样:

RewriteRule .* framework/init.php

除了在这个框架内,有一些目录可以从中提供文件,而不需要PHP处理请求。但是,我不想使用这些目录的实际路径,因为我希望能够让PHP路由器解释这些路径。 因此,我想为这些目录添加别名。例如:

RewriteRule ^i/com/(\w+)/(.*)$ framework/components/$1/images/$2

现在的问题是,这两个重写规则都是单独工作的,但是当我尝试将它们组合起来时,事情就出错了。在别名重写发生后,它似乎重新评估了我的整个.htaccess。以下是我尝试过的一些例子:

在特定条件下跳过重写所有内容:

rewriteRule ^i - [S=1]
RewriteRule .* framework/init.php
RewriteRule ^i/com/(\w+)/(.*)$ framework/components/$1/images/$2

不起作用。看起来第二行被跳过,然后第三行重写为不跳过第二行的条件,然后执行第二行。


使用独占重写 - 所有内容:

RewriteRule (?!i).* framework/init.php
RewriteRule ^i/com/(\w+)/(.*)$ framework/components/$1/images/$2

同样的故事。


在异常行之后停止重写引擎:

RewriteRule ^i/com/(\w+)/(.*)$ framework/components/$1/images/$2 [L]
RewriteRule .* framework/init.php

不工作。


添加重写条件:

RewriteCond %{REQUEST_URI} ^(?!i)
RewriteRule .* framework/init.php
RewriteRule ^i/com/(\w+)/(.*)$ framework/components/$1/images/$2

请注意,当我删除两个RewriteRules中的一个时,所有上述示例都会开始工作。我已经找到了类似的问题,但他们都有我试图应用的解决方案。他们的问题和我的问题之间的一个区别是,我想要重写我的特殊"目录到一个目录,当正常请求时,将导致重写init.php。任何人都可以告诉我这是否可能,如果是的话,我缺少什么或没有得到什么?

2 个答案:

答案 0 :(得分:0)

在执行some research后,我发现重写引擎确实在重写之后重新评估路径:

  

当处理重写请求时,可能会再次遇到.htaccess文件或部分,因此可以从头开始再次运行规则集。最常见的情况是,如果其中一个规则导致重定向(内部或外部)导致请求进程重新开始,则会发生这种情况。

我应该使用[END]标志来完全停止重写引擎。

  

备用标志[END]不仅可以用于终止当前轮次的重写处理,还可以防止在每个目录(htaccess)上下文中发生任何后续重写处理。这不适用于外部重定向产生的新请求。

但是,此[END]标志为new since Apache 2.4

  

mod_rewrite为RewriteRule添加[QSD](查询字符串丢弃)和[END]标志,以简化常见的重写方案。

所以结论是:除非我有Apache 2.4,否则我无法完成。

编辑:我将把这个答案“取消选择”,因为有人知道“老”的做法。

答案 1 :(得分:0)

我今天找到了解决方案。我在匹配^i - 规则时设置了一个环境变量,并检查该环境变量是否稍后设置。如果是,我跳过.* - 规则。像这样:

RewriteRule ^i/com/(\w+)/(.*)$ framework/components/$1/images/$2 [E=REWRITE:1,L]
RewriteCond %{ENV:REDIRECT_REWRITE} !1
RewriteRule .* framework/init.php

可能有点难看。但它在旧版本的Apache中就像一个魅力。