微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在多个.htaccess文件中,多个mod_rewrite规则的优先级是多less?

我明白遵循重写规则的[L]意味着它是“最后”,但我不清楚范围是什么

例如,当存在多个.htaccess文件时,有些文件会使用[L] ,哪些会应用?

例:

root.com/subdirectory1/subdirectory2 ^ ^ ^ | | | ABC

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

htaccess文件以某种方式被caching?

如何通用.htaccess来防止热链接

wordpress的.htaccess重写url

Apache RewriteMap用于防止直接访问文件

使用.htaccess(ErrorDocument 404 +重写规则)为某些文件types设置Web服务器句柄404错误

他们将以什么顺序申请?

如果他们互相矛盾优先?

他们是否连续申请? 第一个结果是否传给下一个呢?

将匹配在较早的(或相同的)文件中,从后面的规则得到的结果被应用?

如果在早期文件中有[L] ,其他文件会被考虑?

apache HTTP:X-Forwarded-Proto in .htaccess在开发环境中导致redirect循环

无法获取.htaccess在本地主机上工作

如何使用htacces从wwwredirect到https www?

.htaccess mod-rewrite apache混淆导致每天10k 404的结果

将.htaccess转换为web.config

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

给你的例子:

root.com/subdirectory1/subdirectory2 ^ ^ ^ | | | ABC

如果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]标志在这里没有任何作用,因为这里的范围只在htaccess文件的规则之内。 另请注意, [L]并不一定意味着“停止重写这里 ”,因为重写引擎将循环,直到进入引擎的URI停止改变。 [L]只是意味着在重写引擎循环的当前迭代中停止重写。

循环的东西更详细一点:

在URL处理管道中,apache尝试将URL映射到文件或资源。 很多不同的模块在处理管道中都有一部分可以使用,比如mod_rewrite或者mod_proxy或者mod_alias。 在任何时候,这个URI都可以改变,被标记为被重定向,被标记为被代理,被标记为抛出错误等。当URI到达mod_rewrite时,重写引擎从vhost配置收集一堆规则,适当的htaccess文件; 请注意,这里有两个不同的范围。 规则的每个范围都应用于URI,如果没有规则匹配,则mod_rewrite完成。 如果其中一个规则匹配,则会有一个内部重定向 ,这意味着URI被更改,然后重定向到处理管道和mod_rewrite。 因此,相同的规则范围再次得到应用,如果其中一个规则匹配并得到应用,同样的事情再次发生规则循环再次。 有一个指令,你可以在虚拟主机/服务器配置LimitInternalRecursion设置一个名为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并在第五次你得到/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服务器错误

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐