如何解决 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) 到不同的域?