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

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

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

    # 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 错误。

感谢任何帮助!

答案1

看起来你的<Directory /path/to/app/public/api>容器是继承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 提供服务。

相关内容