肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

header("Location : xxx.php")と Javascriptのlocation.href = "xxx.php"の区別

header("Location : xxx.php")と Javascriptのlocation.href = "xxx.php"の区別

Twitter / hwittern: 8,header("Location : xxx.php")と ...

8,header("Location : xxx.php")と Javascriptのlocation.href = "xxx.php"の区別
意味的には同じかな?
何を区別したいんだろう

PHP の header("Location : http://.../")

PHPが、HTTPレスポンスのヘッダに「Location: http://.../ 」を吐き、それを受けとったブラウザどこかのページにロケーションする

そんな挙動。


デフォルトではステータスコード 302 が吐かれるっぽいかな?(ドキュメントに書いてない気もするが)


追記:
書いてありました!すみませんすみません><

JavaScript で location.hreg = "http://.../"

ブラウザのアドレス欄に http://.../ って入力するのと同じ。

結果は同じかもしれないけど

それは、人がブラウザでアクセスしたら、の話。
挙動の原理は違う。

前者は、ステータスコードとかも吐けるから、検索エンジンが巡ってきたときにロケーションさせてページの移転を誘導とかできるけど、後者だと人間がブラウザで見たときしか転送できない(たしか!基本検索エンジンはJSでのlocationは判断してないはず)

さらにいえば、まあ、header関数はHTTPヘッダを指定するための関数であって、Locationさせる関数ではないので、意味は全然違うかな。

ちなむと

PHPのheader関数で指定したヘッダはどういうタイミングで送られるかというと、最初に標準出力があったタイミングです。
例えば、echo とか。
ブラウザから見てるときは、HTMLの出力があった段階で、ヘッダとボディが送られる。
なので、当然HTMLを出力した後にはheader関数は使えないなどという話があったり。


追記:
説明がわるかったのですが,「最初のHTMLの出力があった段階」というのは,つまりバッファがフラッシュされるタイミング,ということを言いたかったのです.
header関数を呼んだタイミングで送出されるのではなくて*1,header関数を呼ぶとバッファに,どういうヘッダを送りたいか,が記録されます.
で,最初の出力時をするときに,出力(ボディ)にその指定したヘッダをくっつけてバッファをクリアするってかんじですかね.
なので,「Cannot modify header information」というエラーが出るのは,ヘッダは送出済みなので,もう送れないよ,という警告です.ちなみに,ブラウザは関係ないです.


それだけ

ですた><

*1:というのは,たとえば,header関数を書いた直後に数十秒かかる処理を書いてみれば,そこでは送られないのがわかると思います