我們很常用的一個寫法
header("Location: http://plog.longwin.com.tw/");
這個寫法基本上沒有什麼問題, 但是寫在 function 裡面就有些問題寫了, 詳見下述說明.
先簡單說結論就是:
若要寫成 function, 在 heade Location 下面要加 exit, 否則最好就不要寫成 function 來呼叫.
以下用個簡單範例來說明一下:
function redirect($url) { header("Location: $url"); return True; } if('xxx' == $data) { redirect($url); } ..... 一些資料流程 .... header("Location: $url2");
假設是上面的這支程式, 中間沒有吐出任何字, 只是純處理資料, 照理說我們想要在 $data='xxx' 的狀況下做 redirect 到 $url 去, 但是最後程式跑下來會變成跑到 $url2 去.
主要原因就是我沒有在 function 裡面做 exit; 的動作, 他的實際流程會跑如下述:
- 判斷 $data == 'xxx'
- redirect 到 $url 去, 然後實際已經導過去了.
- 但是此程式因為是 function, 只是呼叫, 呼叫完程式會繼續往下做.
- 程式跑到下面看到要 redirect 到 $url2 去, 於是再次將 url 導到 $url2 去.
簡單說就是, function 呼叫如果沒有給他結束, 那程式的基本流程還是會繼續做到完, 若有其它導向, 就會跟著被導到非預期的地方去.
所以 redirect 的 function 寫法要加 exit 比較保險, 如下範例:
function redirect($url) { header("Location: $url"); exit; }
可以幫我把上面的砍掉嗎,例子不見了:p
不好意思,想說說我的看法,對你的標題有意見。
先看下面的例子
$url = "http://tw.yahoo.com";
header("Location: $url");
$url = "http://www.google.com";
header("Location: $url");
一樣會跑到google
"PHP header Location 不要寫成 function"
聽起來像是一個結論
就我的評估判斷你對某些概念不瞭解,所以你看到的是如此
若你去研究http的概念和php怎麼個跑法。
相信妳會看到不同的觀點
🙂
嗯嗯~ 不好意思, 這標題真的取的很差, 我修改了一下, 感謝您的指導 m(_ _)m.
可否請教您指的 http概念 跟 php跑法 指的是??
就小弟的觀念是如下:
http 接收 header, 而照 header 指定的去跑.
php 送 header 出去, 而寫成 function 並不是不妥, 只是沒有加 exit, 會造成程式繼續往下執行, 進而送出第二個 header.
能否請大大指出小弟的認知錯誤是在哪邊呢? 謝謝~
我只是就我看到的來做"評估判斷",
並沒有說你一定有錯誤認知。
只是覺得標題會讓人有錯誤的聯想。
想跟你討論如此而已。
🙂
嗯嗯~ 了解~ 非常感謝您的提醒~~
很高興跟您討論~~ 謝謝~~ 😀
请问博主,header 到另外一个页面后浏览器会有后退,当点后退后,为什么刚刚设置的头就没有了呢?
我认为是当点浏览器后退后,应该跳转到 header 指定的URL,既后退不到刚刚的页面。
后退功能是保存HTTP头的吧?
就像不用header,提交完交单 刷新浏览器会出现 警告:会重新发送表单信息一样。
厄, 有點難懂..
我想, 說明一下大概是這樣子的狀況.
A頁 -Send-> B頁 header -> C頁.
然後 在 C 點選回上一頁, 應該會回到 A頁.
因為 B頁只是做一個轉導的動作, 我猜瀏覽器的設計, 如果單純 header 做轉址的動作的話, 他可能會直接略過, 因為不這樣子做 C -> B, 馬上 B 又會被導到 C, 那上一頁的做用就不存在了.
不知道這樣子是否有解到您的問題? @.@a
其實就像上面說的 寫不寫成 function 都一樣,
若不加exit;都一樣往下跑!不是嗎?
所以這一篇用途是...... (混淆視聽嗎) @@?
不加 exit; 都會往下跑.
這篇主要是說, 如果寫成 function, 就不要 return, 直接 exit.
因為, 這種 bug 很難追. =.=|||