XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin.
Run Code Online (Sandbox Code Playgroud)
我阅读了有关跨域ajax请求的信息,并了解了基础安全问题.就我而言,2台服务器在本地运行,并且喜欢在测试期间启用跨域请求.
localhost:8080 - Google Appengine dev server
localhost:3000 - Node.js server
Run Code Online (Sandbox Code Playgroud)
我正在localhost:8080 - GAE server
从节点服务器加载我的页面时发出一个ajax请求.什么是最简单,最安全的(不想用disable-web-security
选项启动chrome ).如果我必须改变'Content-Type'
,我应该在节点服务器上做吗?怎么样?
我正在创建一个在其他网站上外部加载的脚本.它加载CSS和HTML,并在我自己的服务器上正常工作.
但是,当我在另一个网站上尝试它时,它会显示这个可怕的错误:
Access-Control-Allow-Origin
Run Code Online (Sandbox Code Playgroud)
在这里你可以看到它完美加载:http://tzook.info/bot/
但在其他网站上显示错误:http: //cantloseweight.co/robot/
我将加载脚本上传到jsfiddle:http: //jsfiddle.net/TL5LK/
我尝试像这样编辑htaccess文件:
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin *
</IfModule>
Run Code Online (Sandbox Code Playgroud)
或者像这样:
Header set Access-Control-Allow-Origin *
Run Code Online (Sandbox Code Playgroud)
但它仍然无效.
Header always set
和Header set
Apache有什么区别?always
关键字在设置标题的情况下会发生什么变化?always
吗?我见过...
Header always set X-Frame-Options DENY
Run Code Online (Sandbox Code Playgroud)
...以及...
Header always set Access-Control-Allow-Headers "*"
Run Code Online (Sandbox Code Playgroud)
...我有时会听到always
关键字的存在确保标题设置正确,或者always
通常包含关键字更好.但是,我从来没有找到一个明确的,明确的答案,为什么会这样.
我已经检查了Apache文档mod_headers
,只是简单地提到always
:
当您的操作是现有标头的函数时,您可能需要指定始终的条件,具体取决于设置原始标头的内部表.始终对应的表用于本地生成的错误响应以及成功响应.另请注意,在某些情况下重复使用这两个条件的指令是有意义的,因为对于现有标头,始终不是onsuccess的超集:
- 您正在为本地生成的非成功(非2xx)响应添加标头,例如重定向,在这种情况下,在最终响应中仅使用始终对应的表.
- 您正在修改或删除由CGI脚本生成的标头,在这种情况下,CGI脚本在对应于始终而不是默认表的表中.
- 您正在修改或删除某些服务器生成的标头,但默认的onsuccess条件未找到该标头.
据我所知,这意味着Header set always
确保即使在非200页面上也设置了标题.但是,我设置的HTTP标头Header set
似乎总是适用于我的404页面等.我在这里误解了什么吗?
FWIW,我发现了SO帖子,比如Apache的Header配置中"always"和"onsuccess"之间有什么区别?,但唯一的答案并没有真正为我解释清楚.
非常感谢,
Caleb
我正在尝试对API进行身份验证,该API仅允许您使用带有JSON的POST作为表单数据进行身份验证,格式为{"username":"myusername","password":"mypassword"}.
我已经尝试了两天来使用jQuery,但是我遇到了问题,因为它是跨域的.我怎么能做到这一点?
错误信息:
Request Method:OPTIONS
Status Code:405 METHOD NOT ALLOWED
Run Code Online (Sandbox Code Playgroud)
代码到现在为止:
var username = "myusername";
var password = "mypass"
var authurl = "https://myurl";
$.ajax
({
type: "POST",
url: authurl,
dataType: 'json',
contentType: "application/json; charset=utf-8",
async: false,
data: {'json':'{"username":"' + username + '", "password":"' + password + '"}'},
success: function (result) {
$('#json').html(result);
}
})
Run Code Online (Sandbox Code Playgroud)
总结一下:
非常感谢您的帮助 :)
我使用Yeoman部署了一个AngularJS应用程序.Cakephp RESTful后端.
Angular应用程序发送OPTIONS预检请求,后端响应禁止(403),在nginx中解决了我使用过的这个问题:
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
add_header 'Access-Control-Allow-Headers' 'X-AuthTokenHeader,Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
Run Code Online (Sandbox Code Playgroud)
我如何在Apache中执行此操作?请提供一些初步指导/意见,我会在此之后弄清楚细节并用细化的细节改进问题.
我正在尝试使用CORS在我的浏览器和Apache服务器(驻留在不同的域中)之间运行AJAX请求.
在服务器端,我在服务器的httpd.conf部分中进行了以下更改,根据" Header set Access-Control-Allow-Origin in .htaccess中的响应不起作用 ":
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"
Run Code Online (Sandbox Code Playgroud)
我的AJAX调用形式如下:
$.ajax({
url :'https://x.x.x.x/validateCustomerID',
type : 'POST',
cache : false,
crossDomain: true,
contentType: 'application/json',
beforeSend: function(xhr){
xhr.setRequestHeader("Access-Control-Allow-Methods","POST");
xhr.setRequestHeader("Access-Control-Allow-Headers","X-Requested-With");
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
},
data : {loginId : '12345'},
success : function(response){console.log("Success"+JSON.stringify(response))},
error : function(response){console.log("Error"+JSON.stringify(response))}
});
}
Run Code Online (Sandbox Code Playgroud)
我也试过注释掉beforeSend()以避免预检请求,但它也没有成功.
我在Chrome和Firefox上收到的错误消息是:
"XMLHttpRequest无法加载https:// xxxx/validateCustomerID.请求的资源上不存在'Access-Control-Allow-Origin'标头.因此不允许原点'null'访问.响应的HTTP状态代码为403."
"阻止跨源请求:同源策略禁止在https:// xxxx/validateCustomerID读取远程资源.(原因:CORS请求失败)."
我的浏览器中没有从服务器收到响应标头,我认为这是CORS必须工作的,并且服务器中的日志显示没有请求从我的浏览器到达它.
我真的很感激,如果有人在这里可以帮助我解决这个问题,因为我已经在这里呆了几天,并且已经使用了几乎所有的命中和试用方法来使这个工作成功.
我正在尝试在 codepen.io ( http://codepen.io/www139/pen/oLrJAZ?editors=0010 )上创建音频可视化程序。我已经建立了自己的网络服务器,用于上传项目的音频。您可以在没有 CORS 问题的情况下收听音频 ( http://williamgreen.hopto.org/audioVisualization/song.mp3 )。但是,音频可视化程序需要访问读取声音频率。当我尝试读取音频时,出现以下错误:
由于http://williamgreen.hopto.org/audioVisualization/song.mp3 的CORS 访问限制,MediaElementAudioSource 输出零
频率返回为 0。
当我添加这一行时:
audio.crossOrigin = 'anonymous';
Run Code Online (Sandbox Code Playgroud)
我不再收到错误,但音频没有加载。
我还尝试根据/sf/answers/818424351/在 .htaccess 中使用此标头设置 CORS 访问。这个问题似乎也很有趣,但缺少我需要的信息(由于 CORS 访问限制本地 mp3 文件,MediaElementAudioSource 输出零)。我也参考了这个(http://enable-cors.org/server_apache.html)。
有什么建议?是否有任何需要设置的 apache/PHP 标头?我怎样才能让它工作?
不久前我问过这个问题(如何使用 apache2 为 Linux 网络服务器上的音频文件设置 CORS 访问权限?)问了这个问题。除了高中之外,我的大脑已经在这个难题上工作了几个月;)
编辑:我问了这个问题,它揭示了更多信息。该问题很可能与用于访问另一个域上的文件的 CORS 标头CORS 标头有关
apache ×4
javascript ×4
cors ×3
.htaccess ×2
ajax ×2
cross-domain ×2
http-headers ×2
audio ×1
jquery ×1
json ×1
node.js ×1
post ×1