【发布时间】:2013-11-06 14:16:29
【问题描述】:
我正在尝试在我的 Web 应用程序上实现 CORS(跨域资源共享)。这是结构:
- 站点 example.com:包含几个 JS 文件(jquery.js、myscript.js)
- 站点 example2.com:从 example.com 加载两个脚本,然后从 myscript.js 调用一个函数,该函数向 example.com 发出 POST 请求
example2.com 代码类似于:
<script src="http://example.com/jquery.js" type="text/javascript"></script>
<script src="http://example.com/myscript.js" type="text/javascript"></script>
<script type="text/javascript">startFunction(1, 2)</script>
两个 JS 在站点 B 上都可以正常加载。但是,当调用该函数并执行 POST(标准 jQuery $.post)时,我收到以下错误:
XMLHttpRequest 无法加载 http://example.com/postrequest。起源 Access-Control-Allow-Origin 不允许http://example2.com。
我去了 example.com 服务器并像这样更新了 .htaccess:
Header set Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control"
Header add Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
我检查了是否正在发送标头,并且确实正在发送它们。使用火狐访问example2.com,JS文件加载完毕,POST请求成功。但是,如果我尝试对 Chrome 进行完全相同的操作,它仍然会失败。我已经处理了几个小时,但我仍然看不出这有什么问题。这是 Chrome 的错误还是什么?
不得不指出,我检查了类似的问题并应用了一些解决方案,但我没有成功。
更新:尝试了添加以下内容的建议解决方案:
$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader('Content-Type', 'text/plain');
}
});
确实设置了 Content-Type,但同样的错误不断发生,所以这并没有解决任何问题。
【问题讨论】:
-
查看类似问题的答案:CORS not working on Chrome
-
我已经检查了该链接(您可以注意到,因为 Allow-Headers 标题与链接的问题完全相同)。
-
但是您的请求中的
'Content-Type'标头呢? -
浏览器在执行 POST 时发送以下内容类型:
Content-Type:application/x-www-form-urlencoded; charset=UTF-8。它应该被允许,因为 .htaccess 文件中列出了“Content-Type”标头。 -
为了完成,也尝试添加
Access-Control-Allow-Credentials: true。我最近看到了一些例子,由于 cookie,Chrome 的行为与 Firefox 不同。
标签: javascript jquery apache http-headers cors