一次跨域問(wèn)題的記錄
前言
最近一個(gè)項(xiàng)目,因?yàn)槟承┰?,需要從https訪(fǎng)問(wèn)改為http訪(fǎng)問(wèn),在改造中出現(xiàn)了跨域的問(wèn)題,在這里記錄下。
項(xiàng)目使用nginx做反向代理。
改造HTTP
訪(fǎng)問(wèn)網(wǎng)站瀏覽器會(huì)自動(dòng)跳轉(zhuǎn)到https,需要把nginx http重定向到https給注釋了
這樣我們?cè)跒g覽器訪(fǎng)問(wèn)的時(shí)候,就不會(huì)自動(dòng)給我們重定向到了https
跨域
在改為http的時(shí)候出現(xiàn)了跨域,一般的解決方法就是在nginx加上如下配置
但是我們?cè)偌由线€是出現(xiàn)了以下錯(cuò)誤
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.
這個(gè)錯(cuò)誤的意思是在預(yù)檢的時(shí)候,瀏覽器不允許重定向。
我們查看MDN對(duì)跨域的定義
跨域?qū)嶋H上是瀏覽器對(duì)不同域訪(fǎng)問(wèn)的一種保護(hù),不然誰(shuí)都可以隨意訪(fǎng)問(wèn)你域名的資源,也是恐怖的
在不是簡(jiǎn)單的請(qǐng)求的情況下,瀏覽器一般都會(huì)發(fā)布一個(gè)options預(yù)檢請(qǐng)求,以獲知服務(wù)器是否允許該實(shí)際請(qǐng)求。"預(yù)檢請(qǐng)求“的使用,可以避免跨域請(qǐng)求對(duì)服務(wù)器的用戶(hù)數(shù)據(jù)產(chǎn)生未預(yù)期的影響。
這個(gè)設(shè)計(jì)挺人性化的,總不能直接在你的業(yè)務(wù)請(qǐng)求上加吧?
回到我們的問(wèn)題,就是在預(yù)檢的時(shí)候,不允許重定向,可我的地址沒(méi)有進(jìn)行重定向,難道什么東西在背后偷偷咪咪的給我做了一層重定向?
請(qǐng)求鏈路:瀏覽器--》nginx--》業(yè)務(wù)
業(yè)務(wù)是肯定沒(méi)有重定向的,瀏覽器也不會(huì)無(wú)緣無(wú)故重定向,那么只有NGINX了
打開(kāi)瀏覽器控制臺(tái),在網(wǎng)絡(luò)層我們可以看到

瀏覽器預(yù)檢發(fā)現(xiàn)狀態(tài)碼是307,那肯定是重定向了,而且一個(gè)注意的點(diǎn),Non-Authoriatative-Reason居然是HTTPS,我們?cè)缇桶裯ginx的https換成了http,訪(fǎng)問(wèn)的域名也是http,所以這個(gè)地方肯定有問(wèn)題
原因在我的nginx配置里有這個(gè)配置,大概意思就是 告知瀏覽器當(dāng)前域名的所有請(qǐng)求都使用https,這也就是為什么我請(qǐng)求用http,在options探測(cè)的時(shí)候,自動(dòng)給我重定向成了https,而cros規(guī)定在預(yù)檢完成前,不允許重定向,所以導(dǎo)致了這里的問(wèn)題
去掉這句話(huà),或者改成以下形式,重啟nginx,清理瀏覽器緩存,或者改用無(wú)痕模式訪(fǎng)問(wèn),options就不會(huì)在重定向了。
