如何解决 307 重定向上的 CORS 错误

Posted

技术标签:

【中文标题】如何解决 307 重定向上的 CORS 错误【英文标题】:How to get around CORS error on a 307 redirect 【发布时间】:2019-03-18 15:55:33 【问题描述】:

我在 .htaccess 中使用 307 重定向 mod_rewrite 规则将所有 /api/... 请求重定向到 apiHandler.php,但我遇到了 CORS 问题。

我的.htaccess

RewriteEngine On
RewriteRule ^api/(.*)$ /apiHandler.php [NC,R=307]

我的apiHandler.php

<?php

header("Access-Control-Allow-Origin: http://localhost:4200");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Headers: Content-Type");
header("Content-Type: application/json");

...

?>

每当我在前端发出 api 请求时,都会收到 CORS 错误,

"...has been blocked by CORS policy: No 'Access-Control-Allow-Origin` header is present on the request resource."

但我的 apiHandler.php 中专门有那个标题,所以我不知道问题是什么。

经过一番研究,我听说重定向 URL 还必须包含 Access-Control-Allow-Origin 标头,否则浏览器将在尝试跨域请求时停在那里。但是我已经尝试过将这些标题添加到我的.htaccess 中,但没有成功。

有什么想法吗?

【问题讨论】:

确保您还将 Access-Control-Allow-Origin 响应标头添加到 /api/students/1/courses 路由的响应中。检查浏览器 devtools 中的响应以确认响应中的标头。 /api/students/1/courses 不是真正的端点。我想重定向到 apiHandler.php 以剖析 REST api url,以便我可以路由到正确的 REST 名词。 @sideshowbarker 所以因为它不是一个真正的端点,我无法向它添加标题,如果这有任何意义的话。 是的,我现在明白了。那么您是否尝试在我们的 .htaccess 中添加标题?如果可以,请尝试添加您的 .htaccess:header always set Access-Control-Allow-Origin "http://localhost:4200"\n header always set Access-Control-Allow-Credentials "true"\n header always set Access-Control-Allow-Headers "Content-Type" 【参考方案1】:

谢谢@sideshowbarker!我的问题的解决方案是从我的apiHandler.php 中删除标题并将它们添加到我的.htaccess

Header always set Access-Control-Allow-Origin "http://localhost:4200"
Header always set Access-Control-Allow-Credentials "true"
Header always set Access-Control-Allow-Headers "Content-Type"
Header always set Content-Type "application/json"

RewriteEngine On
RewriteRule ^api/(.*)$ /apiHandler.php [NC,R=307]

注意使用Header always set ... 而不是Header set ...。这个post 解释了两者的区别。

【讨论】:

以上是关于如何解决 307 重定向上的 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

带有“ 307临时重定向”的Android VideoView播放URL

如何解决“重定向已被 CORS 策略阻止:没有 'Access-Control-Allow-Origin' 标头”?

如何在 nodejs express 重定向上启用 CORS?

Safari 是不是正确处理临时重定向 (307) 到不同的域?

如何在通过 ajax 执行后期操作时克服 CORS 重定向问题?

无法使用scrapy框架307重定向错误来刮取myntra API数据