問題復現
- 先訪問
https://a.com, 該網頁JS會請求https://api.a.com接口 - 再訪問
http://a.com, 該網頁JS會請求http://api.a.com,但是查看網絡請求發現,http://api.a.com被強制307到了https://api.a.com
經過排查發現,這是命中了瀏覽器的HSTS策略,即:
一切能通過https訪問的網址,都用https來訪問
「能通過https訪問的網址」怎么定義呢?那就是你曾經訪問過該網址的https鏈接。
- (當然可以通過清除瀏覽器歷史記錄來騙過瀏覽器,但你的用戶可能不知道這個操作)
問題解決
- server端重定向用戶訪問的
http鏈接到https - 如果必須允許用戶訪問
http鏈接,則服務端接口針對80端口請求做跨域支持,因為跨端口也是跨域
307從何而來,是個什么東西呢
經過使用chrome://net-internals/追蹤發現,是瀏覽器自己返回的:
URL_REQUEST_REDIRECT_JOB --> reason = "HSTS" t=24613 [st= 2] URL_REQUEST_FAKE_RESPONSE_HEADERS_CREATED --> HTTP/1.1 307 Internal Redirect Location: https://api.a.com Non-Authoritative-Reason: HSTS Access-Control-Allow-Origin: http://api.a.com Access-Control-Allow-Credentials: true
【參考的文章鏈接】 https://xwenliang.cn/p/5be6e275469f887b71000001
