我试图通过连接到Flask内置的RESTful API来使用JavaScript进行授权.但是,当我发出请求时,我收到以下错误:
XMLHttpRequest无法加载http:// myApiUrl/login.请求的资源上不存在"Access-Control-Allow-Origin"标头.因此不允许原点'null'访问.
我知道API或远程资源必须设置标题,但为什么在我通过Chrome扩展程序Postman发出请求时它可以正常工作?
这是请求代码:
$.ajax({
type: "POST",
dataType: 'text',
url: api,
username: 'user',
password: 'pass',
crossDomain : true,
xhrFields: {
withCredentials: true
}
})
.done(function( data ) {
console.log("done");
})
.fail( function(xhr, textStatus, errorThrown) {
alert(xhr.responseText);
alert(textStatus);
});
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个nginx配置设置,它确实设置了Access-Control-Allow-Origin收到的值Origin.
似乎该*方法不适用于Chrome,并且多个URL不适用于Firefox,因为CORS规范不允许这样做.
到目前为止,唯一的解决方案是设置Access-Control-Allow-Origin原始接收的值(是的,可以实现一些验证).
问题是如何在nginx中执行此操作,最好不要安装其他扩展.
set $allow_origin "https://example.com"
# instead I want to get the value from Origin request header
add_header 'Access-Control-Allow-Origin' $allow_origin;
Run Code Online (Sandbox Code Playgroud) 我尝试为 nginx使用一个非常流行的配置,它启用 CORS 并支持使用正则表达式进行源匹配。
这是我的配置:
server {
listen 80 default_server;
root /var/www;
location / {
if ($http_origin ~ '^http://(www\.)?example.com$') {
add_header Access-Control-Allow-Origin "$http_origin";
}
# Handling preflight requests
if ($request_method = OPTIONS) {
add_header Content-Type text/plain;
add_header Content-Length 0;
return 204;
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,此配置必须使用两个条件:一个是匹配原始域名,另一个是捕获预检请求。因此,当第二个条件匹配时,第一个条件的标头不会添加到响应中。
根据If Is Evil官方文章,这是 nginx 的预期行为。
如果If Is Evil我如何在 nginx 中启用 CORS 呢?或者也许有办法以某种方式克服这种限制?
CORS 对于域和子域无法正常工作。我有一个 NodeJS服务器托管在https://api.example.com我有两个 ReactJS 客户端
客户端 1. https://example.com
客户端 2. https://subdomain.example.com
我已将客户端 1 配置为强制使用 www,以便客户端 1 使用单个源。当我打开 Clien1 时,它工作正常。当我打开 Client2 时,我收到错误消息
CORS 策略阻止了在“ https://api.example.com/someAPI ”处从源“ https://subdomain.example.com ”访问 XMLHttpRequest :“Access-Control-Allow-Origin”标头具有值 ' https://www.example.com ' 不等于提供的来源
当我按 Ctrl+F5 时,它工作正常,但之后如果我刷新 Client1,则错误出现在 Client1
CORS 策略阻止了从源“ https://www.example.com ”访问“ https://api.example.com/someAPI ”处的 XMLHttpRequest :“Access-Control-Allow-Origin”标头具有值 ' https://subdomain.example.com ' 不等于提供的来源。
现在,当我在 Client1 上按 Ctrl+F5 时,它工作正常,但同样的错误会发生在 Client2 上。
我的nodeJS服务器配置如下
var whitelist = ['https://www.example.com', 'https://subdomain.example.com'];
getCorsCoptions(req, callback) {
var getOriginValue = () => {
if (whitelist.indexOf(req.header('origin')) !== -1) {
return …Run Code Online (Sandbox Code Playgroud) cors ×4
javascript ×2
nginx ×2
axios ×1
cross-domain ×1
express ×1
jquery ×1
node.js ×1
preflight ×1
reactjs ×1