【问题标题】:Response for preflight has invalid HTTP status code 403 in Angular 2Angular 2 中的预检响应具有无效的 HTTP 状态代码 403
【发布时间】:2018-01-25 17:44:34
【问题描述】:

我正在使用 Angular 2 和 Ionic 2 应用程序。我不得不更改到另一台服务器进行测试,API 已停止工作并出现以下错误消息:

预检响应包含无效的 HTTP 状态代码 403

我将此添加到 .htaccess

<IfModule mod_headers.c>
    Header append Vary User-Agent env=!dont-vary
    Header add Access-Control-Allow-Origin "*"
    Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
    Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
</IfModule>

这在我的角度提供者上:

  loginUser(data): Observable<any> {
    let username: string = data.username;
    let password: string = data.password;
    let headers: Headers = new Headers();
    let url = this.domain + "/wp-json/wp/v2/users/me?context=edit";
    let bt = btoa(username + ":" + password);

    this.storage.save('bt', {'bt':bt});
    headers.append("Authorization", "Basic " + bt);
    headers.append('Access-Control-Allow-Headers', 'Content-Type');
    headers.append("Content-type", "application/x-www-form-urlencoded");
    headers.append('Access-Control-Allow-Origin', '*');

    return this.http.get(url, {headers: headers}).map(res => res.json())
  }

另外,启用了一个我为 CORS 问题提供的 chrome 插件,当我在本地项目上时,该插件已启用并适用于其他情况。

我尝试了所有我找到的东西,但我不确定我还能做什么。

检查 Chrome Dev Console 上的网络选项卡,响应是这个:

<HTML>
<HEAD>
<TITLE>403 Forbidden</TITLE>
</HEAD>
<BODY>
<H1>Forbidden</H1>
You do not have permission to access this document.
<P>
<HR>
<ADDRESS>
Web Server at my domain here
</ADDRESS>
</BODY>
</HTML>

根据答案,这也是我的重写规则:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

【问题讨论】:

  • 从您提供的内容来看,从前端的角度来看,您做得很好。后端服务出了点问题。你知道 403 HTTP 代码用于“禁止”,所以你不能做你想做的事情。
  • 如果您仍然启用了该 chrome 插件,则需要禁用它,然后将其关闭。因为否则它只会干扰您的故障排除
  • 您是否确认您实际上可以在浏览器中直接导航到该/wp-json/wp/v2/users/me?context=edit,而在您尝试这样做时也不会收到 403?因为配置问题可能与预检 OPTIONS 无关,而是无论使用什么类型的 HTTP 方法请求该 URL,您都会得到它。也就是说,可能是您的 Apache 配置基本上只是对对该 URL 的任何请求执行“全部拒绝”。问题中的详细信息并未表明是否是这种情况。

标签: javascript angular .htaccess cors preflight


【解决方案1】:

403 响应状态表示服务器后端未配置为处理OPTIONS 请求(包括CORS preflight OPTIONS requests)的一般问题。

服务器必须以 2xx 成功状态(通常为 200 或 204)响应 OPTIONS 请求。

如果服务器不这样做,并且您的请求触发浏览器执行CORS preflight OPTIONS request,那么您将其配置为响应的Access-Control-* 标头没有区别——因为如果预检失败,浏览器就停在那里,永远不会继续执行GET 请求问题中的代码 sn-p 是要发送的。

对于问题中的代码 sn-p,代码添加的 Authorization 标头是触发浏览器进行预检的原因,也是需要服务器处理 OPTIONS 请求的原因。

配置服务器以正确方式处理 OPTIONS 请求(发送 200 或 204 成功消息)的答案取决于它运行的服务器软件。该问题表明服务器正在运行 Apache,因此您可以尝试将其添加到您的 .htaccess

RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]

更新

如果您的.htaccess 中有某些内容以某种方式限制了对/wp-json/wp/v2/users/me 的访问,则需要将其包装在&lt;LimitExcept OPTIONS&gt;…&lt;/LimitExcept&gt; 中;例如:

<LimitExcept OPTIONS>
  Require valid-user
</LimitExcept>

【讨论】:

  • 所以我看到你的 .htaccess 用于处理 OPTIONS 请求。添加后你仍然得到403吗?如果是这样,并且您的 .htaccess 中有一些其他代码限制了对 /wp-json/wp/v2/users/me 路由的访问,那么您需要使其不限制对 OPTIONS 请求的访问(而是我猜只适用于 GET 请求)。至于身份验证,需要明确的一点是浏览器在发出 OPTIONS 请求时不会发送 Authorization 请求标头。所以 OPTIONS 请求必须在不需要 Authorization 标头的情况下工作。
  • 两台服务器中的 .htaccess 完全相同。但你可能在另一部分是正确的。我检查了网络选项卡,请求标头上没有基本身份验证。
  • 有关如何确保 OPTIONS 请求正常工作的另一个建议,请参阅添加到答案中的更新
【解决方案2】:

HttpOptions 不对请求附加授权,您需要在 Options 端点上使用 AllowAnonymous

【讨论】:

  • 我对服务器端设置不太熟悉。您能否复制粘贴上面的 .htaccess 并替换您所指的部分?
【解决方案3】:

你可以很容易地度过这个难关!现在就跟着我吧

  1. 在桌面上创建快捷方式
  2. 右键单击快捷方式,然后单击属性
  3. 编辑目标属性

  1. 将其设置为“C:\Program Files (x86)\Google\Chrome\Application\chrome.exe”--5。 disable-web-security --user-data-dir="C:/ChromeDevSession"
  2. 在 VIsual Studio Code 中,运行 ionic serve -l
  3. 你会看到新标签打开http://localhost:8100/ionic-lab。你应该知道这个链接是在普通的 chrome 选项卡中打开的,而不是我们设置的“disable-web-security”chrome。
  4. 双击我们设置的快捷方式打开“disable-web-security”chrome 选项卡。然后将http://localhost:8100/ionic-lab 粘贴到此选项卡中。

因此,我们在使用 woo-commerce-api 时遇到多个错误的原因是 Google 的“网络安全”。然后你只需禁用它,你实际上不需要任何 CORS 扩展。因此,如果您已安装,请立即删除它们。

我为学习这门课程的人写了这个解决方案https://www.udemy.com/ionic-3-apps-for-woocommerce-build-an-ecommerce-mobile-app/。这是一个离子电子商务应用程序,它使用 woo-commerce-api 从 Wordpress(本地或实时服务器)设置和获取数据。如果您在使用其他非离子语言时遇到问题,它仍然可以正常工作。

实际上,我在 Google 上进行了很多搜索以找到此解决方案。我希望这对你们所有人都有帮助。现在,我要睡觉了,因为明天我要和我的讲师就这个离子项目做一个最终报告?

再见! 归乐

【讨论】:

  • 这是一个客户端问题的解决方案,这个是服务器端的
  • 是的,我意识到了。那么我该如何删除这个答案,@Heady?
猜你喜欢
  • 2016-02-08
  • 2018-09-22
  • 2017-08-11
  • 2016-04-14
  • 2023-04-10
  • 2018-04-05
  • 2018-04-11
  • 2016-12-17
  • 2018-09-30
相关资源
最近更新 更多