我的应用程序位于一个目录中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 错误。
感谢任何帮助!
看起来您的
<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 路径,例如:我也简化
^(.*)$
为.
,因为你只需要为非空 URL 路径处理它,你应该使用标志END
,而不是L
防止重写引擎不必要的循环。(NC
旗帜也是多余的。)在这种情况下,
index.php
很可能由 mod_dir (DirectoryIndex
) 而不是 mod_rewrite 提供服务。