Apache 为什么Mod_只重写URL路径中最深文件夹的.htaccess文件夹中的执行指令?

Apache 为什么Mod_只重写URL路径中最深文件夹的.htaccess文件夹中的执行指令?,apache,.htaccess,mod-rewrite,redirect,Apache,.htaccess,Mod Rewrite,Redirect,我正在Windows7机器上运行XAMPP。我在Apache 2.4.10安装中启用了Mod_Rewrite。我已将.htaccess文件放置在: /.htaccess /category/.htaccess /类别/subcat/.htaccess /product/.htaccess 在我过去使用Mod_Rewite的每台服务器上,如果我请求/category/subcat/some-file.html,它会 评估位于URL路径中引用的最深文件夹中的.htaccess中的所有规则(即/

我正在Windows7机器上运行XAMPP。我在Apache 2.4.10安装中启用了Mod_Rewrite。我已将.htaccess文件放置在:

  • /.htaccess
  • /category/.htaccess
  • /类别/subcat/.htaccess
  • /product/.htaccess
在我过去使用Mod_Rewite的每台服务器上,如果我请求/category/subcat/some-file.html,它会

  • 评估位于URL路径中引用的最深文件夹中的.htaccess中的所有规则(即/category/subcat/.htaccess)
  • 如果请求的URL与/category/subcat/.htaccess文件中的任何规则不匹配,它将向上移动一个目录,并评估/category/.htaccess中的规则
  • 如果请求的URL与/category/.htaccess文件中的任何规则都不匹配,那么它将上移到文档根目录,并评估/htaccess文件中的规则(如果存在)
出于某种奇怪的原因,我的配置阻止了这种自下而上的评估

在我的安装中请求URL时,它只计算URL路径中引用的最深文件夹中.htaccess中的规则。如果找不到匹配项,它将从不检查父目录、祖父母目录等以获取要评估的.htaccess文件

例如

如果我请求localhost/some-file.html,那么它只计算/.htaccess文件中的规则。如果找到匹配项,则按指定重定向。如果不是的话,它会像我预料的那样停止

但是,如果我请求localhost/category/some-file.html,那么它只计算/category/.htaccess文件中的规则。如果找到匹配项,则按指定重定向。如果在/category/.htaccess中找不到匹配项,它将永远不会计算/htaccess中的规则

类似地,如果我请求localhost/category/subcat/some-file.html,那么它只计算/category/subcat/.htaccess文件中的规则。如果找到匹配项,则按指定重定向。如果在/category/subcat/.htaccess中找不到匹配项,它将不会弹出一个级别来评估/category/.htaccess文件中的规则

在我的httpd.conf中,我有:

DocumentRoot "C:/xampp/htdocs"
<Directory "C:/xampp/htdocs">
    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Require all granted
</Directory>
你知道会发生什么吗

提前谢谢

默认情况下,只计算每个目录上下文中的mod_重写规则。除非明确使用
Inherit
rewrite选项,否则将忽略父目录中的任何规则

:

这将强制当前配置继承父配置。在每个虚拟服务器上下文中,这意味着将继承主服务器的映射、条件和规则。在每个目录上下文中,这意味着继承父目录的.htaccess配置的条件和规则

从父作用域继承的规则在子作用域中指定的规则之后应用。

但是,在Apache2.4中,有几种类型的继承。除了能够从父母那里继承外

如果启用此选项,则所有子配置将继承当前配置的配置。这相当于在所有子配置中指定
RewriteOptions Inherit
。有关如何处理父子关系的详细信息,请参见“继承”选项。 在Apache HTTP服务器2.4.8及更高版本中提供


因此,您可能一直在使用Apache2.4.8,并在服务器或vhost配置中启用了
InheritDown
选项。这不是apache默认提供的方式。

谢谢Jon。我并不是有意暗示我过去一直在使用Apache2.4.8,并亲眼目睹了这种行为。在过去,我可能一直在使用一个旧版本,或者一个已经由我的客户或他们的托管公司配置了正确继承类型的版本(我做SEO咨询)。多年来,我已经使用了几个版本的XAMPP来开发网页,但这是我第一次在本地设备上使用它来编写和测试重定向。我通常会在已经配置好的客户端测试服务器上执行此操作。在2.4.8之前,您描述的自动继承类型不是apache mod_重写的一部分
LogLevel warn rewrite:trace8