本文收錄於 GitHub 日問: DailyQuestion,內含大廠內推機會、面經大全及若干面試題,天天學習五分鐘,一年進入大廠中。html
CORS
經過控制 Access-Control-Allow-Origin
控制哪些域名能夠共享資源,取值以下前端
Access-Control-Allow-Origin: <origin> | *
其中 *
表明全部域名,origin
表明指定特定域名,那如何設置多個域名了?git
此時須要經過代碼實現,根據請求頭中的 Origin
來設置響應頭 Access-Control-Allow-Origin
,那 Origin 又是什麼東西?github
並非全部請求都會自動帶上 Origin
,在瀏覽器中帶 Origin
的邏輯以下面試
Origin
,值爲當前域名Origin
邏輯理清楚後,關於服務器中對於 Access-Control-Allow-Origin
設置多域名的邏輯也很清晰了跨域
Origin
,證實未跨域,則不做任何處理Origin
,證實跨域,根據 Origin
設置相應的 Access-Control-Allow-Origin: <Origin>
使用僞代碼實現以下:瀏覽器
// 獲取 Origin 請求頭 const requestOrigin = ctx.get('Origin'); // 若是沒有,則跳過 if (!requestOrigin) { return await next(); } // 設置響應頭 ctx.set('Access-Control-Allow-Origin', requestOrigin)
此時能夠給多個域名控制 CORS,但此時假設有兩個域名訪問 static.shanyue.tech
的跨域資源緩存
foo.shanyue.tech
,響應頭中返回 Access-Control-Allow-Origin: foo.shanyue.tech
bar.shanyue.tech
,響應頭中返回 Access-Control-Allow-Origin: bar.shanyue.tech
看起來一切正常,但若是中間有緩存怎麼辦?bash
foo.shanyue.tech
,響應頭中返回 Access-Control-Allow-Origin: foo.shanyue.tech
,被 CDN 緩存bar.shanyue.tech
,因由緩存,響應頭中返回 Access-Control-Allow-Origin: foo.shanyue.tech
,跨域出現問題此時,Vary: Origin
就上場了,表明爲不一樣的 Origin
緩存不一樣的資源服務器
CORS 如何指定多個域名?
根據請求頭中的 Origin
來設置響應頭 Access-Control-Allow-Origin
,思路以下
Vary: Origin
,避免 CDN 緩存破壞 CORS 配置Origin
,證實未跨域,則不做任何處理Origin
,證實瀏覽器訪問跨域,根據 Origin
設置相應的 Access-Control-Allow-Origin: <Origin>
使用僞代碼實現以下
// 獲取 Origin 請求頭 const requestOrigin = ctx.get('Origin'); ctx.set('Vary', 'Origin') // 若是沒有,則跳過 if (!requestOrigin) { return await next(); } // 設置響應頭 ctx.set('Access-Control-Allow-Origin', requestOrigin)
相關問題: 如何避免 CDN 爲 PC 端緩存移動端頁面
我是山月,正致力於天天用五分鐘可以看完的簡短答案回答一個大廠高頻面試題。掃碼添加個人微信,備註進羣,加入高級前端進階羣.
歡迎關注公衆號【互聯網大廠招聘】,定時推送大廠內推信息及面試題簡答,天天學習五分鐘,半年進入大廠中