据我所知, [L]
以下重写规则意味着它是“最后”,但我不清楚的范围是什么
例如,当有多个.htaccess文件,有的用[L]
哪些会申请?
例:
root.com/subdirectory1/subdirectory2
^ ^ ^
| | |
A B C
如果在每个目录中的.htaccess文件...
- 在什么样的顺序将它们应用?
- 如果他们互相矛盾哪一个优先?
- 难道他们的串行应用? 在第一结果传递到下一个?
- 将在较早的(或相同)的匹配文件从后面的规则,结果得到应用?
- 如果有一个
[L]
在之前的文件将其他文件会考虑?
在[L]
标志确实是指“最后”,但它仅适用于在当前范围内的规则。 从你的问题,它仅适用于在htaccess文件的规则。 如果有规则的子目录,在父目录中的任何规则都抛到了九霄云外。 他们没有施加在所有的,除非你使用RewriteOptions Inherit
指令(这将追加到规则从父htaccess文件的任何规则的结束)。
鉴于您的例子:
root.com/subdirectory1/subdirectory2
^ ^ ^
| | |
A B C
如果有A,B和C htaccess的文件,重写规则中的所有3,如果一个请求http://root.com
(你的“root.com”的目录),只在规则得到应用。 如果有人请求http://root.com/subdirectory1
,那么只有在B中的规则得到应用,并且在任何规则都将被忽略(不Inherit
选项)。 同样,如果有人去http://root.com/subdirectory1/subdirectory2
,然后只在C的规则得到应用,如果没有继承选项。
在[L]
标志有任何这不玩耍,因为这里的范围仅是内部的htaccess文件的规则。 还要注意的是[L]
并不一定意味着“停止重写HERE”,为重写引擎将循环播放,直到URI进入发动机停止变化。 在[L]
仅仅意味着停止在重写引擎的循环的当前迭代改写。
在循环的东西多一点细节:
在URL处理管道,阿帕奇试图将URL映射到一个文件或资源。 不同模块的许多产品都在处理流水线玩,像mod_rewrite的或mod_proxy的或mod_alias中的一部分。 在任何时候,这个URI可以改变,被标记重定向,被标记被代理,被标记当URI到达mod_rewrite的抛出异常等,重写引擎收集一堆的规则从虚拟主机配置和适当htaccess文件; 注意,这里2个不同的范围。 规则每个范围被施加到URI,如果没有规则匹配,则mod_rewrite的完成。 如果规则的一场比赛,有一个内部重定向 ,这意味着URI改变,然后重定向到处理管道和mod_rewrite的。 这样的规则相同范围再次得到应用,如果规则一场比赛,并得到应用,同样的事情又再次发生了规则循环。 还有,你可以在一个名为虚拟主机/服务器配置设置指令LimitInternalRecursion
它设置这些内部重定向的上限。 如果次数重写引擎环路(即重定向到本身)超过此限制(默认为10,我认为),那么你会得到一个500内部服务器错误。
这听起来有点古怪,但有一个为想要做这个有很多实例。 例如:删除所有_
从URI与替代-
RewriteRule ^(.*)_(.*)$ /$1-$2 [L]
如果URI是/a_b_c_d_foo
那么第一次,URI被改为/a_b_c_d-foo
,那么循环和被改为`/a_b_c-d-foo
,然后再次/a_b-cd-foo
和,大约5时你/abcd-foo
。 它会循环一次,但由于^(.*)_(.*)$
模式不匹配,该URI通过重写引擎和循环停止。
改写:当人们创建不考虑循环规则,例如,就会出现问题/<anything>
到/foo/<anything>
:
RewriteRule ^(.*)$ /foo/$1 [L]
如果URI是/bar
然后在第一次获取URI改写为/foo/bar
,并且这是所期望的结果。 但是,URI被内部重定向回重写引擎和相同的规则重新匹配,导致: /foo/foo/bar
,然后再: /foo/foo/foo/bar
,并再次: /foo/foo/foo/foo/bar
,直到达到内部递归限制,你会得到一个500服务器错误。
文章来源: What is the precedence of multiple mod_rewrite rules in multiple .htaccess files? [closed]