CORS – 如何“预检”一个httprequest?

我正在尝试做一个跨域HTTP请求到WCF服务(我自己)。 我已经阅读了几种处理跨域脚本限制的技术。 因为我的服务必须兼容GET和POST请求,所以我不能实现一些dynamic脚本标记,其src是一个GET请求的URL。 由于我可以自由地在服务器上进行更改,因此我已经开始尝试实施一种解决方法,其中包括configuration服务器响应,以包含“Access-Control-Allow-Origin”标头和“预检”请求和OPTIONS请求。 我从这篇文章中得到了这个想法: 让CORS工作

在服务器端,我的web方法是在HTTP响应中添加“Access-Control-Allow-Origin:*”。 我可以看到,现在的回复确实包含了这个头文件。 我的问题是:如何“预检”请求(OPTIONS)? 我正在使用jQuery.getJSON进行GET请求,但浏览器立即取消了臭名昭着的请求:

Access-Control-Allow-Origin不允许来源http:// localhost

有人熟悉这种CORS技术吗? 客户需要做什么修改来预检我的请求?

谢谢!

在预检请求期间,您应该看到以下两个标题:访问控制请求方法和访问控制请求标题。 这些请求标头要求服务器进行实际请求的权限。 您的印前检查响应需要确认这些标头才能使实际的请求生效。

例如,假设浏览器使用以下标题发出请求:

Origin: http://yourdomain.com Access-Control-Request-Method: POST Access-Control-Request-Headers: X-Custom-Header 

您的服务器应该使用以下标题进行响应:

 Access-Control-Allow-Origin: http://yourdomain.com Access-Control-Allow-Methods: GET, POST Access-Control-Allow-Headers: X-Custom-Header 

请特别注意Access-Control-Allow-Headers响应标题。 这个头部的值应该与Access-Control-Request-Headers请求头部中的头部相同,并且不能是'*'。

一旦您将此响应发送到预检请求,浏览器就会发出实际的请求。 您可以在这里了解更多关于CORS的信息: http ://www.html5rocks.com/en/tutorials/cors/

虽然这个主题可以追溯到2014年,但是这个问题对我们许多人来说仍然是当前的。 下面是我在jQuery 1.12 / PHP 5.6上下文中处理它的方法:

  • jQuery只使用有限的头文件发送XHR请求; 只发送了“Origin”。
  • 不需要预检请求。
  • 服务器只需检测这样的请求,并添加“访问控制允许来源:”。 $ _SERVER ['HTTP_ORIGIN']头,在检测到这是一个跨源XHR。

PHP代码示例:

 if (!empty($_SERVER['HTTP_ORIGIN'])) { // Uh oh, this XHR comes from outer space... // Use this opportunity to filter out referers that shouldn't be allowed to see this request if (!preg_match('@\.partner\.domain\.net$@')) die("End of the road if you're not my business partner."); // otherwise oblige header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']); } else { // local request, no need to send a specific header for CORS } 

特别是不要添加exit; 因为不需要预检。