crossorigin引發(fā)的問題追蹤

背景

上線了新的業(yè)務(wù),域名是{cityId}.yy.com,產(chǎn)品打算驗(yàn)收一下嘉栓,結(jié)果反饋好幾個(gè)同事先訪問https://sh.yy.com之后切換到https://cd.yy.com 瀏覽的時(shí)候出現(xiàn)圖片加載不出來的情況永部。經(jīng)過排查發(fā)現(xiàn)是js沒加載成功導(dǎo)致懶加載沒生效,外在表現(xiàn)就是圖片沒加載成功亥至。控制臺(tái)報(bào)錯(cuò)如下:

控制臺(tái)錯(cuò)誤模擬

交代下https://j1.cdn.com.cn/域名下的資源是放在cdn上的靜態(tài)資源(資源每次上線會(huì)更新版本號(hào)贱迟,不會(huì)緩存)姐扮,上線的網(wǎng)站域名如下https://cd.yy.comhttps://sh.yy.com (三級(jí)域名是代表城市衣吠,前面cd代表成都茶敏,bj代表北京);

現(xiàn)象

當(dāng)前域名為https://cd.yy.com蒸播,打開Network睡榆;

查看https://j1.cdn.com.cn/aa.js請求返回值,袍榆,response headersaccess-control-allow-origin:https://sh.yy.com胀屿。也就像控制臺(tái)的報(bào)錯(cuò)一樣,與當(dāng)前域名不一致導(dǎo)致跨域包雀。但是我們看請求的另外一個(gè)文件https://j1.cdn.com.cn/bb.js宿崭,這個(gè)的access-control-allow-origin:https://cd.yy.com及當(dāng)前域名,bb.js文件請求就沒有任何問題才写。

疑問

1.為什么我這邊幾個(gè)開發(fā)的電腦都沒有這種問題葡兑,但是產(chǎn)品卻大概率有這問題,有時(shí)候刷新就恢復(fù)正常了赞草?
2.為什么https://j1.cdn.com.cn/aa.jsresponse headers中的域名不是當(dāng)前域名讹堤?
3.為什么同樣是j1.cdn.com.cn域名下兩個(gè)文件(aa.js和bb.js)的access-control-allow-origin卻不一樣?

猜測

通過bug出現(xiàn)反饋的操作流程和報(bào)錯(cuò)信息來看厨疙,應(yīng)該是cdn資源被緩存住了洲守。由于開發(fā)這邊每次看問題常年喜歡打開控制臺(tái)而且勾上disable cache,所以每次請求都沒有走瀏覽器的緩存沾凄。將disable cache取消并且進(jìn)行切換域名操作果然復(fù)現(xiàn)了梗醇。那么其他疑問產(chǎn)生了。

疑問4:為什么瀏覽器的disable cache項(xiàng)可以影響到后端返回的response headers,以至于資源無法加載撒蟀?

疑問5:還是說這個(gè)請求所謂的response headers是由于資源請求有問題叙谨,瀏覽器自身機(jī)制直接取上次的值呢?

通過在iTerm執(zhí)行命令行 curl -IL https://j1.cdn.com.cn/aa.js保屯,可以看到response headers中的access-control-allow-origin確實(shí)是https://sh.yy.com,說明疑問5中的說法不成立手负,response headers確實(shí)是服務(wù)器端返回的涤垫。

返回值模擬

那么我們看一下這個(gè)資源請求方式有什么不同:


html中請求的script標(biāo)簽

看到了個(gè)后來加入的屬性crossorigin="anonymous",添加這個(gè)屬性是因?yàn)橐肓吮O(jiān)控系統(tǒng)虫溜,通過這個(gè)屬性可以獲取到資源內(nèi)部詳細(xì)的報(bào)錯(cuò)信息雹姊。對(duì)這個(gè)屬性不熟悉的可以參考這里股缸。

crossorigin="anonymous"

實(shí)踐

有了以上猜測之后隨即移除了aa.js等一切js靜態(tài)資源的crossorigin屬性衡楞,移除之后發(fā)現(xiàn)靜態(tài)資源可以正常加載,查看下詳細(xì)的網(wǎng)絡(luò)請求返回的字段敦姻;

1.https://j1.cdn.com.cn/aa.js請求返回值response headersaccess-control-allow-origin:https://sh.yy.com瘾境。

2.https://j1.cdn.com.cn/bb.js請求返回值response headersaccess-control-allow-origin:https://cd.yy.com

和報(bào)錯(cuò)時(shí)候返回的一致镰惦,但是瀏覽器并沒有再報(bào)錯(cuò)了迷守,資源可以正常請求;

結(jié)論

由于cdn根據(jù)資源路徑緩存了response里面的內(nèi)容旺入,當(dāng)我們在不同域名下請求相同資源的時(shí)候就會(huì)出現(xiàn)域名不一致的問題兑凿;如果標(biāo)簽中添加了crossorigin="anonymous"屬性,那么跨域請求的時(shí)候就會(huì)判斷是否同源茵瘾,如果不是同源的話礼华,請求將會(huì)報(bào)錯(cuò)并無法正常處理response。

Q&A

在此拗秘,我們來一一解答下上面的疑問圣絮,找到答案的小伙伴這里可以略過啦;

Q1:為什么我這邊幾個(gè)開發(fā)的電腦都沒有這種問題雕旨,但是產(chǎn)品卻大概率有這問題扮匠?
A1:開發(fā)的時(shí)候會(huì)勾選disable cache,此時(shí)瀏覽器將不會(huì)走本地緩存凡涩。產(chǎn)品的電腦一般都沒有進(jìn)行勾選棒搜,所以當(dāng)切換域名時(shí),請求的還都是從本地緩存中的資源活箕,response header等其他數(shù)據(jù)也都是之前緩存過的力麸,所以當(dāng)使用資源使用crossorigin屬性,就會(huì)報(bào)錯(cuò)讹蘑。

Q2:為什么https://j1.cdn.com.cn/aa.jsresponse headers中的域名不是當(dāng)前域名末盔?
A2:綜上,因?yàn)閏dn緩存住了請求https://j1.cdn.com.cn/aa.js的內(nèi)容及response headers等信息座慰;

Q3:為什么同樣是j1.cdn.com.cn域名下兩個(gè)文件(aa.js和bb.js)的access-control-allow-origin卻不一樣陨舱?
A3:綜上,因?yàn)檫@兩個(gè)請求的資源是由不同的cdn返回的版仔,所以緩存的內(nèi)容也不一致游盲,查看response header 可以看到误墓,aa.js是x-via: DIANXIN-TIANJIN_41(200:miss);DIANXIN-TIANJIN_39(200:hit),bb.js是x-via: DIANXIN-TIANJIN_41(200:hit)

Q4:為什么瀏覽器的disable cache項(xiàng)可以影響到后端返回的response headers,以至于資源無法加載?
A4:并不是影響到了后端的返回益缎,而是瀏覽器的機(jī)制谜慌。當(dāng)查看到設(shè)置了crossorigin屬性且請求返回值的access-control-allow-origin與當(dāng)前域名不一致后拋出了錯(cuò)誤,不再進(jìn)行進(jìn)一步渲染等操作莺奔;

Q5:這個(gè)瀏覽器所謂的response headers是由于資源請求有問題欣范,瀏覽器自身機(jī)制直接取上次的值呢?
A5:這個(gè)上面有寫到令哟,使用curl或者抓包工具恼琼,可以看到后端返回的就是控制臺(tái)network展示的這些信息。

有其他問題歡迎交流~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屏富,一起剝皮案震驚了整個(gè)濱河市晴竞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狠半,老刑警劉巖噩死,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異神年,居然都是意外死亡已维,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門瘤袖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衣摩,“玉大人,你說我怎么就攤上這事捂敌“纾” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵占婉,是天一觀的道長泡嘴。 經(jīng)常有香客問我,道長逆济,這世上最難降的妖魔是什么酌予? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮奖慌,結(jié)果婚禮上抛虫,老公的妹妹穿的比我還像新娘。我一直安慰自己简僧,他們只是感情好建椰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岛马,像睡著了一般棉姐。 火紅的嫁衣襯著肌膚如雪屠列。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天伞矩,我揣著相機(jī)與錄音笛洛,去河邊找鬼。 笑死乃坤,一個(gè)胖子當(dāng)著我的面吹牛苛让,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侥袜,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼蝌诡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了枫吧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤宇色,失蹤者是張志新(化名)和其女友劉穎九杂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宣蠕,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡例隆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抢蚀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镀层。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖皿曲,靈堂內(nèi)的尸體忽然破棺而出唱逢,到底是詐尸還是另有隱情,我是刑警寧澤屋休,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布坞古,位于F島的核電站,受9級(jí)特大地震影響劫樟,放射性物質(zhì)發(fā)生泄漏痪枫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一叠艳、第九天 我趴在偏房一處隱蔽的房頂上張望奶陈。 院中可真熱鬧,春花似錦附较、人聲如沸吃粒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽声搁。三九已至黑竞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疏旨,已是汗流浹背很魂。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留檐涝,地道東北人遏匆。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像谁榜,于是被迫代替她去往敵國和親幅聘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344