什么是多.htaccess文件多mod_rewrite的规则的优先级? [关闭](What is

2019-08-20 04:42发布

据我所知, [L]以下重写规则意味着它是“最后”,但我不清楚的范围是什么

例如,当有多个.htaccess文件,有的用[L]哪些会申请?

例:

root.com/subdirectory1/subdirectory2

  ^           ^            ^      
  |           |            |
  A           B            C

如果在每个目录中的.htaccess文件...

  1. 在什么样的顺序将它们应用?
  2. 如果他们互相矛盾哪一个优先?
  3. 难道他们的串行应用? 在第一结果传递到下一个?
  4. 将在较早的(或相同)的匹配文件从后面的规则,结果得到应用?
  5. 如果有一个[L]在之前的文件将其他文件会考虑?

Answer 1:

[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]