《Redirect is not allowed for a preflight request 》《Non-Authoritative-Reason: HSTS》 跨域 https HSTS 问题

背景

  • admin.toocruel.net 跨域jquery &.post 访问 api.toocruel.net
  • api.toocruel.net http https 均支持
  • 在chrome浏览器下

问题

  • http自动跳转到https,但是我没配置强制跳转
    地址栏输入http//api.toocruel.net 会自动跳转到https上去,但是我在nginx上没配置过自动跳转啊,后端程序是springboot做的,也没有强制http到https的处理

  • 网络请求:跨域的options请求返回了307 重定向
    QQ20191123-221216@2x

  • 控制台
    QQ20191123-221800@2x

尝试换域名试试

我用另外一个域名,重新测了一下跨域请求,同样的配置,同样的调用方式,跨域请求是正常的
QQ20191123-221324@2x

分析

从错误的信息里可以获取到两个关键点:

  • 重定向
  • HSTS

什么是HSTS

HSTS指的是HTTP Strict Transport Security,可以理解为服务器告诉浏览器这个网站支持HTTPS,以后的访问都给我强制转到HTTPS上去,不准使用HTTP。

明明我地址栏输入的是http为何会自动跳转到https

因为我的api.toocruel.net 是支持https访问的,虽然我没做强制跳转配置,但是有HSTS,还是会自动跳转到https

options的307重定向 是不是跟这个hsts导致的https跳转有关呢

试一试吧
了解了hsts了配置后知道了 hsts是有时间设置的,默认max-age很大,如果把它设置很小 比如1,是不是就相当于让hsts无效了呢?

果然,问题解决。

总结

我出现这样问题的原因是http和https混用导致的,正常的情况是全https 或全http,是不会有这样的问题的。
只要在http的网站中跨域访问https的地址就有可能出现我这种问题,也不能怨hsts不合理,是我用的方式不对。
如果出现我这种问题,建议两种方案:

关闭HSTS,就是上述的将hsts的有效期设成1,或者直接关闭,但是这样就失去了hsts的保护,因为我这是内部的后台系统,没什么安全的要求,确实不需要hsts。

避免在http跨域访问https,可以将http网站也升级到https。

希望,对你有所帮助。

(全文完)