gpt4 book ai didi

apache - 多个 .htaccess 文件中多个 mod_rewrite 规则的优先级是什么?

转载 作者:行者123 更新时间:2023-12-02 15:52:32 25 4
gpt4 key购买 nike

据我了解,[L]遵循重写规则意味着它是“最后一个”,但我不清楚范围是什么

例如,当有多个 .htaccess 文件时,有些文件带有 [L] ,哪些会适用?

示例:

root.com/subdirectory1/subdirectory2

^ ^ ^
| | |
A B C

如果每个目录下都有.htaccess文件...

  1. 它们将按什么顺序应用?
  2. 如果它们相互矛盾,哪个优先?
  3. 它们是否连续申请?第一个的结果是否传递给下一个?
  4. 是否会应用较早(或相同)文件中由较晚规则产生的匹配结果?
  5. 如果有 [L]在较早的文件中是否会考虑其他文件?

最佳答案

[L] flag确实意味着“最后”,但它只适用于当前范围内的规则。从您的问题来看,它仅适用于 htaccess 文件中的规则。如果子目录中有规则,则父目录中的任何规则都会被抛出窗口。它们根本不适用,除非您使用 RewriteOptions Inherit指令(它将把父 htaccess 文件中的任何规则附加到规则的末尾)。

给出你的例子:

root.com/subdirectory1/subdirectory2
^ ^ ^
| | |
A B C

如果A、B、C都有htaccess文件,并且3个都有重写规则,如果有一个请求http://root.com (您的“root.com”目录),仅应用 A 中的规则。如果有人请求http://root.com/subdirectory1 ,则仅应用 B 中的规则,并且忽略 A 中的任何规则(不带 Inherit 选项)。同样,如果有人去http://root.com/subdirectory1/subdirectory2 ,如果没有继承选项,则仅应用 C 中的规则。

[L] flag 在这方面没有任何作用,因为这里的范围仅在 htaccess 文件的规则内。另请注意 [L]并不一定意味着“停止重写这里”,因为重写引擎将循环直到进入引擎的 URI 停止更改。 [L]只是意味着在重写引擎循环的当前迭代中停止重写。

<小时/>

有关循环内容的更多详细信息:

在 URL 处理管道中,apache 尝试将 URL 映射到文件或资源。许多不同的模块都在处理管道中发挥作用,例如 mod_rewrite 或 mod_proxy 或 mod_alias。在任何时候,这个 URI 都可以更改、被标记为重定向、被标记为被代理、被标记为引发错误等。当 URI 到达 mod_rewrite 时,重写引擎会从虚拟主机配置中收集一堆规则,并适当的 htaccess 文件;请注意,这里有两个不同的范围。每个规则范围都应用于 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-c-d-foo到第 5 次时,您会得到 /a-b-c-d-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 服务器错误。

关于apache - 多个 .htaccess 文件中多个 mod_rewrite 规则的优先级是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15869322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com