为什么我在这里看到"Access-Control-Allow-Origin不允许来源"错误?

Muh*_*man 151 javascript ajax xmlhttprequest youtube-api cors

我看到以下错误:

Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin
Run Code Online (Sandbox Code Playgroud)

使用此代码:

var http = new getXMLHttpRequestObject();
var url = "http://gdata.youtube.com/action/GetUploadToken";
var sendXML = '<?xml version="1.0"?><entry xmlns="http://www.w3.org/2005/Atom"'+
    'xmlns:media="http://search.yahoo.com/mrss/'+
    'xmlns:yt="http://gdata.youtube.com/schemas/2007">'+
    '<media:group><media:title type="plain">My First API</media:title>'+
    '<media:description type="plain">First API</media:description>'+
    '<media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People</media:category>'+
    '<media:keywords>first, api</media:keywords></media:group></entry>';
http.open("POST", url, true);
http.setRequestHeader("Authorization", "AuthSub token=" + AccessToken);
http.setRequestHeader("X-GData-Key", "key="+ dev_key);
http.setRequestHeader("Content-Type", "application/atom+xml; charset=UTF-8");

http.onreadystatechange = function() {
    if(http.readyState == 4) {
        alert(http.responseXML);
    }
}
http.send(sendXML);
Run Code Online (Sandbox Code Playgroud)

是什么导致这种情况,我该如何解决?

and*_*ier 171

在当前域之外发出ajax请求时,Javascript受到限制.

  • 例1:你的域名是example.com,你想向test.com发出请求=>你不能.
  • 例2:您的域名是example.com,您想向inner.example.com发送请求=>您不能.
  • 例3:你的域名是example.com:80,你想向example.com发送请求:81 =>你不能
  • EX 4:你的域名是example.com,你想向example.com发送请求=>你可以.

出于安全原因,Javascript受"同源策略"的限制,因此恶意脚本无法联系远程服务器并发送敏感数据.

jsonp是一种使用javascript的不同方式.您发出请求并将结果封装到在客户端中运行的回调函数中.它与将新脚本标记链接到html的head部分相同(您知道可以从不同的域加载脚本而不是您的脚本).
但是,要使用jsonp,必须正确配置服务器.如果不是这种情况你不能使用jsonp,你必须依赖服务器端代理(PHP,ASP等).有很多与此主题相关的指南,只是谷歌吧!

  • 谢谢!我不知道这会发生在同一台主机上,而是发生在另一个端口上. (3认同)

Sun*_*nny 88

localhost:8080由于"同源策略",XMLHttpRequest不允许您访问.

您可以通过在响应中添加标头来允许来自现代浏览器的请求localhost:8080:

Access-Control-Allow-Origin: *
Run Code Online (Sandbox Code Playgroud)

您可以通过向HTTP服务器添加指令或通过服务器端代码(PHP,Ruby,...)添加标头来实现.

https://developer.mozilla.org/en/http_access_control上阅读有关Cross-Origin ajax请求的更多信息

  • 如果我理解正确,那么API或远程资源的服务器(在这种情况下是YouTube服务器)必须设置标头,即必须设置此标头的API主机,而不是API调用者. (15认同)
  • 有没有其他人觉得这令人困惑?使用Fiddler我可以看到正在发出请求并返回有效结果......然后我得到一个例外.所以服务器似乎根本不关心.然而,服务器是需要配置的? (2认同)
  • 这里服务器不关心.它是通过仅回放服务器允许列表中的请求来尝试保护用户的浏览器. (2认同)

Deq*_*ing 37

如果您使用的是Chrome,那么一个简单的解决方法(仅用于开发目的)就是使用选项--disable-web-security.

  • 你肯定_only_想要为了发展目的而做,_never_在冲浪时 (52认同)

小智 10

在解决方案中添加global.asax.

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
Run Code Online (Sandbox Code Playgroud)

protected void Application_BeginRequest(object sender, EventArgs e)
{
}
Run Code Online (Sandbox Code Playgroud)


Eri*_*roy 9

如果您使用apache,则可以正常工作:将其放入/创建公共根目录中的.htaccess文件,并添加您可能需要的任何其他文件扩展名.

<FilesMatch "\.(ttf|otf|eot|woff|jpg|png|jpeg|gif|js|json|html|css)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)


Chr*_*ler 7

对于本地开发,您可以使用工具来修改HTTP响应头.例如,Charles可以通过包含的重写工具来执行此操作:重写工具

只需为目标域/位置添加新规则:

Type: Add Header
Where: Response
Replace
     Name: Access-Control-Allow-Origin
     Value: *
Replace All
Run Code Online (Sandbox Code Playgroud)


Sir*_*dda 5

这里,我们需要为Apache Http做两件事

1) 在 httpd.config 文件中,取消注释此文件

LoadModule headers_module modules/mod_headers.so
Run Code Online (Sandbox Code Playgroud)

2)在底部添加这一行。

Header set Access-Control-Allow-Origin "*"
Run Code Online (Sandbox Code Playgroud)