很抱歉,如果之前已经问过/回答过这个问题,但我无法找到这个特定问题的答案。
如果我使用简单的重写规则创建 .htaccess 文件,则该规则有效。如果我在子目录中使用它自己的重写配置创建另一个 .htaccess 文件,则顶层的主 .htaccess 文件将停止被读取。我什至不需要创建任何规则。只需打开子目录上的重写引擎就会导致更高级别的重写停止工作。
我创建了一组包含两个文本文件的子目录:
[root@apachetest html]# cat test/1/test.txt
1
[root@apachetest html]# cat test/2/test.txt
2
以及一个 .htaccess 文件将 test/1/test.txt 重写为 test/2/test.txt
[root@apachetest html]# cat test/.htaccess
RewriteEngine on
RewriteRule 1/test.txt 2/test.txt [L]
这按预期工作。如果我请求 1/test.txt 我会得到 2/test.txt
[root@apachetest html]# curl localhost/test/1/test.txt
2
但是,如果我在 test/1/ 子目录中创建另一个 .htaccess 文件,则 test/.htaccess 文件将停止工作。
[root@apachetest html]# echo "RewriteEngine On" > test/1/.htaccess
[root@apachetest html]# curl localhost/test/1/test.txt
1
我已经尝试了所有的 RewriteOptions;/test/.htaccess 和 /test/1/.htaccess 中的 Inherit、InheritBefore、InheritDown、InheritDownBefore 和 IgnoreInherit 但如果 /test/1/.htaccess,我无法让 /test/.htaccess RewriteRule 工作里面有任何重写配置。
我需要能够将 RewriteRules 放入子目录中,而不影响顶级目录中的 RewriteRules。谁能告诉我我错过了什么?
是的,默认情况下,mod_rewrite 指令不会被子配置继承。因此,如果子目录文件中有 mod_rewrite 指令
.htaccess
(即使只是启用或禁用重写引擎),则父目录/配置中的 mod_rewrite 指令将被完全覆盖 - 它们根本不会被处理。是的,这就是您需要执行的操作才能启用 mod_rewrite 继承。您选择哪个选项取决于您希望继承父/子指令的位置和时间。
然而,“问题”是 mod_rewrite 指令“继承”的方式。它们是通过有效地将指令复制到相应的配置中来继承的。它们不会在其原始配置的上下文中进行处理。这会影响相对 URL 路径等内容。通常,该
RewriteRule
指令匹配相对于包含该.htaccess
文件的目录的 URL 路径。但是,如果这些指令被“继承”(即有效复制)到子配置中,那么这些相对 URL 路径将会不同,并且规则可能不再匹配。“继承”指令需要以不依赖于处理它们的目录的方式编写 - 因此在目录上下文中继承指令时不一定依赖该
RewriteRule
模式。所以,用你的例子......
/test/1
并且我们在子目录文件中启用mod_rewrite继承.htaccess
:这有效地导致请求时处理以下内容
/test/1/test.txt
:显然,文件中的
RewriteRule
模式 永远不会匹配,因此该规则不会执行任何操作。(需要修改规则以仅匹配,但替换也需要修改,否则会将请求重写为- ,而该请求不存在。)1/test.txt
test/1/.htaccess
test.txt
/test/1/2/test.txt
需要修改继承/父配置中的指令以避免对父所在目录的依赖
.htaccess
。例如:该条件有效地重复了 的测试
test.txt
,但更具体。您可以使该RewriteRule
模式完全通用,但随后将为每个请求处理该规则。注意:我捕获了第一个路径段,并
%1
在替换中使用了相应的反向引用,以避免必须对文件所在的目录进行硬编码.htaccess
。当 mod_rewrite 在目录( ) 上下文中使用时,这种“继承”模式会出现更多问题/更复杂
.htaccess
。(无论如何,当在目录上下文中使用时,mod_rewrite 通常会更复杂。)相对路径问题不是服务器配置/虚拟主机中指令的问题,因为路径都是相对于根目录的。