« ブロガーライセンスがブロガー向けのライセンスでない件についてのお詫び | メイン | RSS フィードの SEO 対策 - 9つのポイント(?) »

2006年03月17日

リダイレクト時の Location ヘッダに絶対 URL を設定する方法 あとで読む

ついにこのブログもフィードメーターの人気度=星2つに落ちてしまいました。。。

自分のツールにも見放されるくらいブログで情報発信してなかったと反省。

・・・また少し技術的なtipsなども交えていろいろ書いていこうと思います。

ということで少し以前に話題になっていた「POST後はリダイレクトした方が吉:phpspot開発日誌」についてのメモ的エントリでも。

ブラウザのバックボタンで前のページに戻れることはユーザーにとっては既に常識化(?)されているので、私もほとんどの場合 POST 後にリダイレクトを行っています。
#そのほうがロジックと画面も整理しやすいので。


ただ、リダイレクト = Location ヘッダには「絶対URL」という大きな壁があり、みなさんどうしているんだろうと興味津々。

参考:[Studying HTTP] HTTP Header Fields

URLやポート番号が決まっているような Web サービスでは決め打ちで設定できるのですが、配布可能なポータブルなコードとなるとこれが結構大変です。
#いや、技術者ならドメインが決まっているサイトでもポータブルなコードにしたいと思うはず#

しかし、サーバーから与えられた情報からスクリプト側で100%正確な絶対URLを復元することは不可能に近く、最悪リダイレクトした瞬間 cookie が消える=アプリケーションが動かないなんてことにもなります。

参考: おさかなラボ / Blog Archive / Locationヘッダについて

絶対URLにするのは RFC 的に必要だとはいえ、実際 i-mode や一部のブラウザを除いて多くの場合相対パス指定でも動作することを考えると相対パスで書くのが「現実的」というのもうなづけます。


で、私が使っているのは「リファラ」を絶対URLの復元検証に使う方法です。

リファラはファイアウォールやセキュリティソフトなどにより削られたり変更されたりすることも多々あるので、リファラを信用して絶対URLを復元することは厳しいのですが、「復元した絶対URLが正しいかどうか」の検証を行うことはできます。


つまり、絶対URLを復元しリファラと照合して問題なければ、正しい絶対URLが得られたことが確認できます。

リファラがない、またはなぜか照合できない場合は、RFC 絶対という方はそれでも頑張って復元、大きな声では言えないけど相対パスでもいいやという方は標準的なポート番号などでのアクセス以外は相対パスで逃げ切る、というのが最適解かな、と思います。

逃げ切り方が微妙に RFC に沿ってないので異論もあるかと思いますが、逆に他に良い 絶対URL の復元方法があれば是非教えてください...

※と書いてみたけど結構古典的な方法だったりもするので、やっぱりメモエントリ。そもそも i-mode とかはリファラ送ってこないし・・・ ^^;

Follow yoski on Twitter

ワード

投稿者 aka : 2006年03月17日 20:16  / 2006年03月 / (~2006) 技術ネタ

トラックバック

人気ブログランキング - a++ My RSS 管理人ブログ

このエントリーのトラックバックURL:
http://210.188.206.194/mt-tb-sf.cgi/367

コメント

>サーバーから与えられた情報からスクリプト側で100%正確な絶対URLを復元することは不可能に近く

??
リファラなんて使わなくてもふつうにできません?
どこが不可能なんでしょう。

投稿者 Bar : 日時 2006年03月18日 17:17

イントラネットで使われることも想定すると、結構厳しいと思うのですが・・・。
HTTP/1.0でHOST名がない場合はもちろん、スキームの問題やリバースプロクシの問題など。。。

投稿者 aka : 日時 2006年03月20日 23:03

$_SERVER['SCRIPT_NAME'] に格納されているパスを正規表現で取り出せばいいんじゃないでしょうか?リファラのように書き換えられるようなことはサーバーにバグがない限りないと思います。

投稿者 takuya : 日時 2008年08月22日 02:46

コメントしてください

あわせて読みたい




保存しますか?


あとで読む | to read | フレッシュリーダー | フレッシュミーティング | RSSフィード.cc | あわせて読みたい | track feed MyRSS管理人