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 / 问题 / 1126405
Accepted
oucil
oucil
Asked: 2023-03-17 06:25:32 +0800 CST2023-03-17 06:25:32 +0800 CST 2023-03-17 06:25:32 +0800 CST

由于父规则,子目录上的 mod_rewrite 规则不工作

  • 772

我的应用程序位于一个目录中public,并从一个文件夹中提供服务,我在 public 的子目录中有一个 API 端点,这两个都被重定向到各自的 index.php 文件。在最近的服务器迁移之前,一切都运行良好。但是现在,API 请求被父目录拦截了。这是有问题的虚拟<directory...>主机段......

    # application root
    <Directory "/path/to/app">
        Options FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    # public root
    <Directory /path/to/app/public>
        RewriteBase /
        RewriteCond %{REQUEST_FILENAME} -s [OR]
        RewriteCond %{REQUEST_FILENAME} -l [OR]
        RewriteCond %{REQUEST_FILENAME} -d
        RewriteRule ^.*$ - [NC,L]
        RewriteRule ^.*\.(media.php|png|jpg|gif|ico)$ media.php [NC,L]
        RewriteRule ^.*\.(xml|txt|css|js)$ static.php [NC,L]
        RewriteRule ^.*$ index.php/ [NC,L]
        errordocument 404 /error.php?id=404
    </Directory>

    # API
    <Directory /path/to/app/public/api>
        Header set Access-Control-Allow-Methods "PUT, GET, POST, DELETE, HEAD, OPTIONS"
        RewriteCond %{HTTP:Authorization} ^(.*)
        RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
        RewriteRule ^(.*)$ index.php [L,NC]
    </Directory>

我正在使用 Apache 2.4.53。这些/path/to/app/public指令按预期工作,任何媒体文件扩展名都被重定向到 media.php,任何基于文本的文件都被重定向到 static.php,其他所有内容都被发送到 index.php,并带有 404 错误回退。

如果我mydomain.com/api/单独请求,我会收到正确的 API 特定错误消息,因为该./api/目录实际存在。但是,一旦我请求一个正确的端点,比如mydomain.com/api/v1.0/some-enddpoint/应该在./api/index.php文件中捕获和重定向的端点,我就会收到一个来自父目录的 404 错误。

感谢任何帮助!

apache-2.4
  • 1 1 个回答
  • 56 Views

1 个回答

  • Voted
  1. Best Answer
    MrWhite
    2023-03-17T07:18:07+08:002023-03-17T07:18:07+08:00

    看起来您的<Directory /path/to/app/public/api>容器正在从父容器继承指令。如果设置,或者可能与inheritance相关的其他选项,则会发生这种情况。RewriteBase<Directory /path/to/app/public>RewriteOptions MergeBase

    看起来你不需要容器RewriteBase /中的指令<Directory /path/to/app/public>,所以你可以简单地删除它。但是,请检查您是否在配置的其他地方定义了它。

    或者,在容器RewriteBase /api中设置一个<Directory /path/to/app/public/api>。或者,在替换字符串前加上完整的 URL 路径,例如:

    RewriteRule . /api/index.php [END]
    

    我也简化^(.*)$为.,因为你只需要为非空 URL 路径处理它,你应该使用标志END,而不是L防止重写引擎不必要的循环。(NC旗帜也是多余的。)

    如果我example.com/api/单独请求,我会收到正确的 API 特定错误消息,因为该./api/目录实际存在。

    在这种情况下,index.php很可能由 mod_dir ( DirectoryIndex) 而不是 mod_rewrite 提供服务。

    • 1

相关问题

  • %{REQUEST_FILENAME}.ext 是什么意思?为什么额外的 .ext 结尾?

  • 为什么我的 Apache 能够提供 200 个包含斜杠的 .php 文件?

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