如何防止Chrome将AJAX请求重定向到HTTPS?

时间:2014-08-15 12:14:05

标签: google-chrome xmlhttprequest cors preflight

我的AngularJS应用程序正在对我们的服务执行许多AJAX请求(由Jetty提供支持)。出于某种原因,仅对某些用户发生以下错误,并在要求清除浏览器缓存时消失。此仅在Google Chrome上发生

我在www.domain.com上试图请求api.domain.com。

  

XMLHttpRequest无法加载http://api.domain.com/my-service。该   请求被重定向到“https://api.domain.com/my-service”,其中   不允许需要预检的跨源请求。   /我的电流页

请注意,Chrome 尝试将服务从HTTP重定向到HTTPS 。我的网站可以通过HTTP或HTTPS访问

这是chrome:// net-internals /#events output:

1523417: URL_REQUEST
http://api.domain.com/my-service
Start Time: 2014-08-15 14:17:39.809

t=5984 [st= 0] +REQUEST_ALIVE  [dt=26]
t=5984 [st= 0]   +URL_REQUEST_DELEGATE  [dt=0]
t=5984 [st= 0]      DELEGATE_INFO  [dt=0]
                    --> delegate_info = "extension AdBlock"
t=5984 [st= 0]      DELEGATE_INFO  [dt=0]
                    --> delegate_info = "extension AdBlock"
t=5984 [st= 0]   -URL_REQUEST_DELEGATE
t=5984 [st= 0]   +URL_REQUEST_START_JOB  [dt=26]
                  --> load_flags = 143540480 (DO_NOT_SAVE_COOKIES | DO_NOT_SEND_AUTH_DATA | DO_NOT_SEND_COOKIES | ENABLE_LOAD_TIMING | MAYBE_USER_GESTURE | REPORT_RAW_HEADERS | VERIFY_EV_CERT)
                  --> method = "OPTIONS"
                  --> priority = "LOW"
                  --> url = "http://api.domain.com/my-service"
t=5984 [st= 0]      URL_REQUEST_REDIRECT_JOB
                    --> reason = "HSTS"
t=5985 [st= 1]     +URL_REQUEST_DELEGATE  [dt=25]
t=5985 [st= 1]        DELEGATE_INFO  [dt=25]
                      --> delegate_info = "AsyncResourceHandler"
t=6010 [st=26]     -URL_REQUEST_DELEGATE
t=6010 [st=26]      CANCELLED
t=6010 [st=26]   -URL_REQUEST_START_JOB
                  --> net_error = -3 (ERR_ABORTED)
t=6010 [st=26]    URL_REQUEST_DELEGATE  [dt=0]
t=6010 [st=26] -REQUEST_ALIVE

知道为什么Chrome会强制重定向吗?我在网络选项卡中看不到任何错误,没有任何回复请求。

更多信息:

以下是正在使用的Chrome浏览器上的响应标头。

Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:X-Requested-With, authorization, content-type, X-CSRF-Token
Access-Control-Allow-Methods:GET, POST, HEAD, PUT, OPTIONS
Access-Control-Allow-Origin:http://api.domain.com
Content-Length:0
Server:Jetty(8.y.z-SNAPSHOT)

1 个答案:

答案 0 :(得分:2)

这可能是由于无处不在的HTTPS等扩展或严格传输安全(HSTS)造成的。

这些因素超出了您的控制范围,要解决此问题,您需要修改服务器端API端点以提供CORS响应标头,例如:

Access-Control-Allow-Origin: http://api.domain.com

...或者只是在整个范围内强制执行https。然后,您不必担心http / https来源违规。作为奖励,https最近已成为您网站在Google上排名的积极因素之一。


问题中的日志清楚地表明HSTS是罪魁祸首。 Chrome的HSTS实施目前无法正确处理跨源请求(crbug.com/387198)。网站所有者解决此错误的唯一方法是强制执行全方位的https,并通过https访问API。

如果您想重现该错误,请访问chrome://net-internals/#hsts并通过第一个输入框将域添加到HSTS列表中("添加域")。然后,在重现错误后,通过第二个输入框("删除域")从HSTS列表中删除域。此方法也是用户解决错误的一种方法。毕竟,如果域名从HSTS列表中删除,那么就不再有HSTS重定向。

什么是HSTS?
服务器在其任何https响应中发送Strict-Transport-Security标头后,HSTS将被激活。收到此标题一次后,浏览器将强制通过https请求网页上的所有资源。有关详细信息,请参阅http://chromium.org/stshttp://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security

由于此错误仅针对您的某些用户发生,因此很可能是由浏览器扩展或API域上的某个页面引起的,这些页面以STS标头响应。