cookie系列(二)header302跳轉(zhuǎn)引發(fā)的思考

今天我們來看以下兩個現(xiàn)象近上,并解釋這兩個現(xiàn)象的原因:

第一個現(xiàn)象:

?php文件運(yùn)行過程中如果碰到有header("Location:某個頁面URL");這種語句抚垄,會直接跳轉(zhuǎn)到另一個頁面,但是這里的跳轉(zhuǎn)并不會影響當(dāng)前php文件的繼續(xù)執(zhí)行。

下面我們用代碼跑一下看看上面的現(xiàn)象是否是成立的:

(1)http://a.com/test.php代碼如下:


(2)http://b.com/test.php代碼如下:


(3)訪問http://a.com/test.php顯示以下結(jié)果:




此時魏宽,我們發(fā)現(xiàn)我們顯示的結(jié)果頁中,地址欄變成了b.com/test.php决乎,同時队询,頁面輸出了123,然后我們也看到a.com下面cookie被寫入成功了构诚,而且a.txt文件也生成了蚌斩。

實驗證明,header302跳轉(zhuǎn)之后范嘱,其下面的代碼還是會繼續(xù)執(zhí)行送膳,那么原因是什么呢员魏?

很多人不明白,不是已經(jīng)跳轉(zhuǎn)走了嗎叠聋?跳走了怎么可能還執(zhí)行撕阎?

要解釋這個現(xiàn)象其實原理很簡單,客戶端a向服務(wù)端b發(fā)送請求碌补,服務(wù)端b處理完成之后虏束,響應(yīng)回客戶端a。注意這里面的用詞厦章,處理完成镇匀!處理完成!處理完成袜啃!是服務(wù)端b處理完成之后才會響應(yīng)客戶端汗侵。

上代碼,我們證實一下是不是處理完成之后響應(yīng)回客戶端:

(1)http://a.com/test.php代碼如下:


(2)http://b.com/test.php代碼不變?nèi)缦拢?br>

(3)訪問http://a.com/test.php顯示以下結(jié)果:


瀏覽器一直在加載群发,10秒之后才跳轉(zhuǎn)到http://b.com/test.php頁面晰韵。

上圖中代碼寫的很清楚,先header跳轉(zhuǎn)然后在sleep(10)也物,頁面沒有立即跳轉(zhuǎn)而是停了10秒鐘再發(fā)生跳轉(zhuǎn)宫屠。

所以要想header之后代碼不繼續(xù)執(zhí)行,我們只需要在header后面exit就可以了滑蚯,代碼如下:


那么后面的代碼就不會被執(zhí)行浪蹂!

到這個地方,我們第一個現(xiàn)象的原因其實已經(jīng)解釋完了告材,現(xiàn)在我們來看一個細(xì)節(jié)坤次,http://a.com/test.php代碼如下圖一所示,訪問http://a.com/test.php響應(yīng)回來的內(nèi)容為空斥赋,見下圖二缰猴,我們雖然有echo 有print_r還有var_dump,但是都沒有被輸出疤剑。

(圖一)

(圖二)

通過谷歌瀏覽器滑绒,我們看到服務(wù)端雖然沒有返回內(nèi)容,但是返回了響應(yīng)消息頭隘膘,如下:

由此看來疑故,當(dāng)服務(wù)器端在設(shè)置header響應(yīng)報文給客戶端的時候,如果狀態(tài)碼是302弯菊,那么服務(wù)器端就不會返回具體的數(shù)據(jù)內(nèi)容給客戶端纵势,而瀏覽器看到302,也不用去關(guān)心返回的響應(yīng)內(nèi)容,直接拿著響應(yīng)報文里面的location地址前往下一站去嘍钦铁,這樣的方式也防止了不必要的數(shù)據(jù)傳輸软舌。

這讓我想到了另一張情況,客戶端去情況求服務(wù)端的時候牛曹,服務(wù)端驗證請求資源沒有發(fā)生改變會返回304狀態(tài)碼佛点,那么這個時候服務(wù)器端也不會返回響應(yīng)內(nèi)容,通過304狀態(tài)碼去告訴瀏覽器躏仇,這個資源沒有更改過恋脚,你直接從自己的緩存中去拿吧。

我們繼續(xù)第二個現(xiàn)象:

?header 302跳轉(zhuǎn)可以跳轉(zhuǎn)到其他網(wǎng)站設(shè)置cookie而curl無法給其他站點設(shè)置cookie焰手,這又是為什么?

在之前怀喉,我們其實探討過這個問題jsonp系列(三)兩種寫法請求后端設(shè)置cookie书妻,為啥一個可以,一個不可以躬拢?躲履,其中我們講到了,為什么curl不能跨站設(shè)置cookie,但是今天有小伙伴問聊闯,為啥工猜,header 跳轉(zhuǎn)能夠給其他站點設(shè)置cookie呢?

還是先看代碼吧:

(1)http://a.com/test.php代碼如下:


(2)http://b.com/test.php代碼如下:


(3)訪問http://a.com/test.php我們發(fā)現(xiàn)頁面跳轉(zhuǎn)到http://b.com/test.php并且b.com下被設(shè)置了cookie菱蔬。

這又是什么原因呢篷帅?

為啥curl不可以,header302卻可以?

通過谷歌瀏覽器我們可以發(fā)現(xiàn):


如圖中所示拴泌,當(dāng)我們在地址欄敲下http://a.com/test.php并且敲下回車的時候魏身,通過谷歌瀏覽器我們發(fā)現(xiàn)了兩個請求都是test.php,分別如下:



如上圖蚪腐,當(dāng)瀏覽器去請求http://a.com/test.php的時候箭昵,a.com服務(wù)端返回302給瀏覽器,瀏覽器拿到響應(yīng)消息頭的location回季,存到內(nèi)存中家制,此時瀏覽器與http://a.com的通信過程其實就結(jié)束了,也就是一個請求與響應(yīng)就結(jié)束了泡一,然后瀏覽器拿著location地址重新請求http://b.com/test.php颤殴,于是我們看到瀏覽器跳轉(zhuǎn)的畫面,此時b瘾杭。com返回給瀏覽器的響應(yīng)消息頭里面有set-cookie的信息诅病,那么瀏覽器得到這個cookie信息生成文件并存放到了瀏覽器默認(rèn)cookie存放的目錄下。

如圖所示:

header跳轉(zhuǎn)的情況:


在第6個步驟中,b.com返回了cookie信息給瀏覽器贤笆,瀏覽器存下了b.com的cookie信息蝇棉。


curl請求的情況:


在第6步中,b.com將cookie信息返回給a.com服務(wù)器芥永,但是a.com服務(wù)器并沒有把cookie信息交給瀏覽器篡殷,所以瀏覽器最終沒能寫下b.com的cookie信息。

由此可見埋涧,為啥header可以設(shè)置b.com的cookie板辽,而curl不能設(shè)置b.com的cookie在于,header的時候棘催,服務(wù)端把cookie信息給了瀏覽器劲弦,而curl的時候,b.com把cookie給了a.com服務(wù)器醇坝,并沒有給到瀏覽器邑跪,所以最終一個設(shè)置cookie成功,一個設(shè)置cookie失敗呼猪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末画畅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宋距,更是在濱河造成了極大的恐慌轴踱,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谚赎,死亡現(xiàn)場離奇詭異淫僻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)沸版,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門嘁傀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人视粮,你說我怎么就攤上這事细办。” “怎么了蕾殴?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵笑撞,是天一觀的道長。 經(jīng)常有香客問我钓觉,道長茴肥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任荡灾,我火速辦了婚禮瓤狐,結(jié)果婚禮上瞬铸,老公的妹妹穿的比我還像新娘。我一直安慰自己础锐,他們只是感情好嗓节,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著皆警,像睡著了一般拦宣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上信姓,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天鸵隧,我揣著相機(jī)與錄音,去河邊找鬼意推。 笑死豆瘫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的左痢。 我是一名探鬼主播靡羡,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼俊性!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起描扯,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤定页,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绽诚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體典徊,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年恩够,在試婚紗的時候發(fā)現(xiàn)自己被綠了卒落。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡蜂桶,死狀恐怖儡毕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扑媚,我是刑警寧澤腰湾,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站疆股,受9級特大地震影響费坊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旬痹,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一附井、第九天 我趴在偏房一處隱蔽的房頂上張望讨越。 院中可真熱鬧,春花似錦永毅、人聲如沸把跨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽节猿。三九已至,卻和暖如春漫雕,著一層夾襖步出監(jiān)牢的瞬間滨嘱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工浸间, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留太雨,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓魁蒜,卻偏偏與公主長得像囊扳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子兜看,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容