MAMP Pro / APACHE / PHP 没有为 Fetch OPTIONS 预检请求返回 OK

Posted

技术标签:

【中文标题】MAMP Pro / APACHE / PHP 没有为 Fetch OPTIONS 预检请求返回 OK【英文标题】:MAMP Pro / APACHE / PHP not returning OK for Fetch OPTIONS preflight request 【发布时间】:2019-03-15 15:41:29 【问题描述】:

更新:查看答案以获得解决方案。


我已经在 .htaccess 中尝试过

Header always set Access-Control-Allow-Origin "http://localhost:3000"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, PUT, DELETE"
Header always set Access-Control-Allow-Headers "Origin,Content-Type,Accept,Authorization,X-Requested-With"
# Header always set Access-Control-Allow-Credentials true

AuthType Basic
AuthName "API Service"
AuthUserFile /Users/user/Documents/path/path/path/.htpasswd
Require valid-user

<IfModule mod_rewrite.c>
RewriteEngine On                  
RewriteCond %REQUEST_METHOD OPTIONS 
RewriteRule ^(.*)$ index.php [QSA,L]  
</IfModule>

如何为 MAMP Pro Apache 解决这个问题?

更新:

包装基本身份验证块似乎可以解决 OPTIONS 身份验证预检错误,但现在得到:

Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header contains multiple values '*, http://localhost:3000', but only one is allowed. Origin 'http://localhost:3000' is therefore not allowed access. Have the server send the header with a valid value, or, if an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

【问题讨论】:

要使用 curl 进行测试,您需要让 curl 发送一个 OPTIONS 请求(就像浏览器在尝试 GET 之前所做的那样),如下所示:curl -i -X OPTIONS --user user:password http://api.site.com/ OPTIONS 请求响应的 HTTP 状态码是什么?问题中显示的 curl 调用的响应正文有 服务器遇到内部错误或配置错误,无法完成您的请求 - 尽管正文中有 &lt;title&gt;200 OK&lt;/title&gt;,但这表明HTTP 响应状态码不是 200,而是一些 5xx 或 4xx 状态码。如果浏览器没有看到对 OPTIONS 请求的 2xx 响应,则预检失败。 @sideshowbarker - 这不是重复的 - 它与帖子类似,但涉及 MAMP 并且 Apache 的所有标头都已正确设置。这不是重复的。 Apache 的响应方式与问题中显示的配置告诉它响应的方式完全相同。 “要求有效用户”行告诉 Apache 要求对所有请求进行身份验证——包括 OPTIONS 请求。请参阅 ***.com/a/31753542/441757 ***.com/a/19154721/441757 和 ***.com/a/45623550/441757 等并尝试将“需要有效用户”行(甚至从“AuthType Basic”到“需要有效用户”的 4 行)包装在 &lt;LimitExcept OPTIONS&gt;…&lt;/LimitExcept&gt; 中。跨度> @sideshowbarker - 谢谢 - 好建议,我对 .htaccess 有了更多了解 - 我已将基本身份验证代码块包装在 中,现在收到此错误:对预检的响应请求未通过访问控制检查:“Access-Control-Allow-Origin”标头包含多个值“*,localhost:3000”,但只允许一个。我已经在寻找解决方案,但还没有找到可行的解决方案。另外,.htaccess 文件中只设置了 1 个值,即localhost:3000 【参考方案1】:

在@sideshowbarker 的一些帮助下,能够解决这个问题。

JS fetch 看起来像这样:

fetch(endpoint, 
  headers: new Headers(
     'Authorization': 'Basic ' + Buffer.from('user:pass').toString('base64'),
     'Content-Type': 'application/json; charset=utf-8'
  ),
  mode: 'cors',
  method: 'GET',
  redirect: 'follow'
)
.then(res => res.json())
.then(json => console.log(json))

.htaccess 看起来像这样

<IfModule mod_headers.c>
Header unset Access-Control-Allow-Origin
Header always set Access-Control-Allow-Origin "http://localhost:3000"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, PUT, DELETE"
Header always set Access-Control-Allow-Headers "Origin,Content-Type,Accept,Authorization,X-Requested-With"
# Header always set Access-Control-Allow-Credentials true
</IfModule>

<LimitExcept OPTIONS>
AuthType Basic
AuthName "API Service"
AuthUserFile /Users/adamlabarge/Documents/www/headless/tail/.htpasswd
Require valid-user
</LimitExcept>

要修复 Access-Control-Allow-Origin 中的多个响应,我取消设置 Access-Control-Allow-Origin 并在 .htaccess 中重置它

现在我在 api 目录上设置了基本的 .htpasswd,得到了我期望的 JSON 响应。

【讨论】:

以上是关于MAMP Pro / APACHE / PHP 没有为 Fetch OPTIONS 预检请求返回 OK的主要内容,如果未能解决你的问题,请参考以下文章

本地网络上无法访问 MAMP Pro /MAMP/ 起始页

403 禁止本地主机根 MAMP Pro v2.2

加载 MAMP PRO 起始页 / MAMP 起始页

MAMP Pro3.5注册码

如何在 MAMP PRO 中降级 phpMyAdmin 版本

使用 ngrok 和 MAMP Pro 对我的 php 项目进行隧道传输时,如何获得正确的文档根目录?