我的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)
答案 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/sts和http://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security。
由于此错误仅针对您的某些用户发生,因此很可能是由浏览器扩展或API域上的某个页面引起的,这些页面以STS标头响应。