AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1154115
Accepted
KBM
KBM
Asked: 2024-02-23 02:39:10 +0800 CST2024-02-23 02:39:10 +0800 CST 2024-02-23 02:39:10 +0800 CST

在子目录中创建 .htaccess 会导致更高级别 .htaccess 中的重写规则停止工作

  • 772

很抱歉,如果之前已经问过/回答过这个问题,但我无法找到这个特定问题的答案。

如果我使用简单的重写规则创建 .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。谁能告诉我我错过了什么?

.htaccess
  • 1 1 个回答
  • 24 Views

1 个回答

  • Voted
  1. Best Answer
    MrWhite
    2024-02-23T04:32:24+08:002024-02-23T04:32:24+08:00

    是的,默认情况下,mod_rewrite 指令不会被子配置继承。因此,如果子目录文件中有 mod_rewrite 指令.htaccess(即使只是启用或禁用重写引擎),则父目录/配置中的 mod_rewrite 指令将被完全覆盖 - 它们根本不会被处理。

    我已经尝试了所有的 RewriteOptions;继承、继承之前、继承向下、继承向下、...

    是的,这就是您需要执行的操作才能启用 mod_rewrite 继承。您选择哪个选项取决于您希望继承父/子指令的位置和时间。

    然而,“问题”是 mod_rewrite 指令“继承”的方式。它们是通过有效地将指令复制到相应的配置中来继承的。它们不会在其原始配置的上下文中进行处理。这会影响相对 URL 路径等内容。通常,该RewriteRule指令匹配相对于包含该.htaccess文件的目录的 URL 路径。但是,如果这些指令被“继承”(即有效复制)到子配置中,那么这些相对 URL 路径将会不同,并且规则可能不再匹配。

    “继承”指令需要以不依赖于处理它们的目录的方式编写 - 因此在目录上下文中继承指令时不一定依赖该RewriteRule 模式。

    所以,用你的例子......

    # test/.htaccess 
    RewriteEngine on
    RewriteRule 1/test.txt 2/test.txt [L]
    

    /test/1并且我们在子目录文件中启用mod_rewrite继承.htaccess:

    # test/1/.htaccess 
    RewriteEngine on
    
    RewriteOptions Inherit
    

    这有效地导致请求时处理以下内容/test/1/test.txt:

    # test/1/.htaccess 
    RewriteEngine on
    
    RewriteOptions Inherit
    
    # Due to "Inherit" option the inherited directives from the parent config
    # are effectively copied in-place after the existing directives...
    RewriteRule 1/test.txt 2/test.txt [L]
    

    显然,文件中的RewriteRule 模式 永远不会匹配,因此该规则不会执行任何操作。(需要修改规则以仅匹配,但替换也需要修改,否则会将请求重写为- ,而该请求不存在。)1/test.txttest/1/.htaccesstest.txt/test/1/2/test.txt

    需要修改继承/父配置中的指令以避免对父所在目录的依赖.htaccess。例如:

    # test/.htaccess 
    RewriteEngine on
    RewriteCond %{REQUEST_URI} ^/([^/]+)/1/test\.txt$
    RewriteRule (^|/)test\.txt$ /%1/2/test.txt [L]
    

    该条件有效地重复了 的测试test.txt,但更具体。您可以使该RewriteRule 模式完全通用,但随后将为每个请求处理该规则。

    注意:我捕获了第一个路径段,并%1在替换中使用了相应的反向引用,以避免必须对文件所在的目录进行硬编码.htaccess。

    当 mod_rewrite 在目录( ) 上下文中使用时,这种“继承”模式会出现更多问题/更复杂.htaccess。(无论如何,当在目录上下文中使用时,mod_rewrite 通常会更复杂。)相对路径问题不是服务器配置/虚拟主机中指令的问题,因为路径都是相对于根目录的。

    • 1

相关问题

  • apache重写以将文件夹分配给域

  • Apache conf 或 .htaccess 规则将 404 重定向到特定文件类型的另一个位置

  • 如何让 Apache2 重定向到子目录

  • .htaccess - 删除所有 cookie

  • 我的 .htaccess 文件是什么意思?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve