前言
最近一個項目,因為某些原因粹淋,需要從https訪問改為http訪問,在改造中出現(xiàn)了跨域的問題,在這里記錄下桃移。
項目使用nginx做反向代理屋匕。
改造HTTP
訪問網(wǎng)站瀏覽器會自動跳轉(zhuǎn)到https,需要把nginx http重定向到https給注釋了
server?{
????listen?80;
????listen?[::]:80;
????server_name?server_name;
????location?^~?/.well-known/acme-challenge/?{
????????default_type?"text/plain";
????????root?????????/usr/share/;
????}
????location?=?/.well-known/acme-challenge/?{
????????return?404;
????}
??#??location?/?{
??#??????return?301?https://$host$request_uri;
??#??}
}
這樣我們在瀏覽器訪問的時候借杰,就不會自動給我們重定向到了https
跨域
在改為http的時候出現(xiàn)了跨域过吻,一般的解決方法就是在nginx加上如下配置
add_header?'Access-Control-Allow-Origin'?'*';
但是我們再加上還是出現(xiàn)了以下錯誤
from origin 'null' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
這個錯誤的意思是在預(yù)檢的時候,瀏覽器不允許重定向第步。
我們查看MDN對跨域的定義
跨域?qū)嶋H上是瀏覽器對不同域訪問的一種保護(hù)疮装,不然誰都可以隨意訪問你域名的資源,也是恐怖的
在不是簡單的請求的情況下粘都,瀏覽器一般都會發(fā)布一個options預(yù)檢請求廓推,以獲知服務(wù)器是否允許該實際請求。"預(yù)檢請求“的使用翩隧,可以避免跨域請求對服務(wù)器的用戶數(shù)據(jù)產(chǎn)生未預(yù)期的影響樊展。
這個設(shè)計挺人性化的,總不能直接在你的業(yè)務(wù)請求上加吧堆生?
回到我們的問題专缠,就是在預(yù)檢的時候,不允許重定向淑仆,可我的地址沒有進(jìn)行重定向涝婉,難道什么東西在背后偷偷咪咪的給我做了一層重定向?
請求鏈路:瀏覽器--》nginx--》業(yè)務(wù)
業(yè)務(wù)是肯定沒有重定向的蔗怠,瀏覽器也不會無緣無故重定向墩弯,那么只有NGINX了
打開瀏覽器控制臺,在網(wǎng)絡(luò)層我們可以看到
瀏覽器預(yù)檢發(fā)現(xiàn)狀態(tài)碼是307寞射,那肯定是重定向了渔工,而且一個注意的點,Non-Authoriatative-Reason居然是HTTPS桥温,我們早就把nginx的https換成了http引矩,訪問的域名也是http,所以這個地方肯定有問題
add_header?Strict-Transport-Security?"max-age=63072000"?always;
原因在我的nginx配置里有這個配置侵浸,大概意思就是 告知瀏覽器當(dāng)前域名的所有請求都使用https旺韭,這也就是為什么我請求用http,在options探測的時候掏觉,自動給我重定向成了https茂翔,而cros規(guī)定在預(yù)檢完成前,不允許重定向履腋,所以導(dǎo)致了這里的問題
去掉這句話,或者改成以下形式,重啟nginx遵湖,清理瀏覽器緩存悔政,或者改用無痕模式訪問,options就不會在重定向了延旧。
add_header?Strict-Transport-Security?max-age=0;
本文使用 文章同步助手 同步