我的应用程序位于一个目录中,并由一个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 提供服务。