编辑
通过更多测试纠正了一些假设(并更改了标题以反映)。该问题似乎特定于 DDev 上的 nginx 配置,服务器无法正确地将
"OPTIONS / HTTP/1.1"
请求传递到 Web 根目录(尽管所有路径和邮递员请求工作正常)。
进一步编辑
对于有相同问题的人来说,最好找到精致的问题。
问:发生什么事了?
使用 Axios 从 JavaScript 前端向根级域(例如 https://domain.ddev.site)发出的请求 OPTIONS 失败,并出现 CORS 405 OPTIONS not allowed 错误,尽管所有对路径的 OPTIONS 请求都工作正常。
问:那么你不能允许 OPTIONS 请求
我就是这样。所有路径请求都工作正常(即 https://domain.ddev.site/path)。当向域根发出请求时,Axios 会抛出 405 for options 但请求永远不会到达 index.php 文件。我们在nginx access.log中看到访问请求
问:还有其他信息吗?
axios版本:
"axios": "^0.21.1",
Access to XMLHttpRequest at 'https://domain.ddev.site/' from origin 'http://domain.ddev.site:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
但没有实际请求检查来源。事实证明,该问题特定于与 DDev 一起使用的 nginx 配置。
位置 try_files 配置中包含
$uri/
元素会导致无法正确地将向基域发出的 OPTIONS 请求路由到应用程序。
事实证明,大多数现代 Web 应用程序通常不需要
$uri/
,因为几乎普遍使用单个公开索引文件来处理对应用程序发出的所有请求。因此,可以安全地将其删除,从而解决问题。
请参阅此处的讨论:https://github.com/serversideup/docker-php/issues/89
具体修复是双重的。
在
.ddev/nginx_full/nginx-site.conf
文件中更改:
location / {
absolute_redirect off;
try_files $uri $uri/ /index.php?$query_string;
}
到
location / {
absolute_redirect off;
try_files $uri /index.php?$query_string;
}
您还需要删除文件顶部的
##ddev generated
注释,以防止文件再次被覆盖。
然后重启ddev
ddev restart
这应该可以解决问题。