Chromeの挙動について
リダイレクトしたときに履歴残らないことに疑問があったが解決した。 また、HTTPステータスコードの301と302を返す場合のブラウザの挙動を調べてたらいろいろ面白いことがわかったのでまとめる。
HTTPステータスコード301/302について
どちらもリソースが移動したことを示し、以下のようにリダイレクトが発生する。
- クライアントがhogeへアクセス
- サーバがLocation: fugaを応答
- クライアントがfugaへアクセス
ステータスコードの意味は以下である。
-
301 Moved Permanently
- 完全にリソースが移動した
-
302 Found
- 一時的にリソースが移動した
ささいなニュアンスの差と思っていたが、この後の検証でこれがとんでもない差であることが明らかになる。
適当に302でLocationを応答するサーバを用意する。
$ echo -e "HTTP/1.1 301 Moved\r\nLocation: https://www.slpylabox.com" | nc -N -l 8080;
Chromeでhttp://localhost:8080/にアクセスすると、意図通りにリダイレクトが行なわれる。 そして、履歴にこのページは存在しなかった。Firefoxでも同じ結果だった。
また、このようにブラウザに書き換えさせる方法もある。
echo -e "HTTP/1.1 301 Moved\r\n\r\n<sciprt>window.location='https://www.slpylabox.info';</script> | nc -N -l 8080;
履歴に残らない仕組みはクライアントサイドでこんなことしてるんだろうなと思っていたが全然違った。リダイレクトはそもそも履歴に残らないのだ。
また、不思議なことが起きた。
サーバ建ててない状態でアクセスしても同様にリダイレクトされるのだ。意味不明の挙動だったが、こういうことらしい。
気をつけないと怖いかも?301 リダイレクトはブラウザ上でキャッシュされますよって話 | ocws BLOG
なんと、301は恒久的なリソースの移動ということでChromeに無期限でキャッシュされるのだ。この仕様は本当に驚いた。 一度間違えるとクライアントに誤った情報が恒久的にキャッシュされるため気をつけたし。
新規ウィンドウについて
有害なWebサイト等で新規ウィンドウが立ち上がることがある。 新規タブで開くか新規ウィンドウで開くかをコンテンツ側で指定できるのか不明だった。 タブブラウサの時代はそんなことできず、ユーザのみが選択できるものだったという思い込みがある。完全に老害である。
以下のようにChromeにてwindow.openに然るべき引数を渡すことで新規ウィンドウが立ち上がる。
<script>window.open('about:blank', '_blank', 'width=640, height=480');</script>