我试图重写我的启动文件的所有请求路径。像这样:
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。任何人都可以告诉我这是否可能,如果是的话,我缺少什么或没有得到什么?
答案 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中就像一个魅力。