- ベストアンサー
リダイレクト元のURLの取得方法について
現在、以下2つのphp5プログラム(+ PEAR::AUTH)で、なんちゃってフォーム認証するCGIを作成しています。 環境 Windows XP、Web SV IIS 5.1 (1) aaa.php : PEAR:AUTHを使った、ログイン画面(フォーム認証CGI)。 : 機能 : MySQLに格納されたID/PWで認証する。認証OKだったら、bbb.phpが出力するDBレコードデータ参照ページへのリンク集を出力する。 リンク1)http://domain.jp/bbb.php?id=1001 リンク2)http://domain.jp/bbb.php?id=1002 リンクn)http://domain.jp/bbb.php?id=nnnn ・・・といった感じで、DBに登録されたレコードを表示するCGIへのリンクをずらずら出します。 (2) bbb.php : DBデータを整形し、多少見やすい形に加工したHTMLページを出力する。 この時、aaa.phpが認証OKの証?として出力したCookieが、 1.あったらHTMLページ出力し、 例1)http://domain.jp/bbb.php?id=1001 = 一意のキーid=1001の値で出力出来る、MySQL上のデータをHTML化したもの 例2)http://domain.jp/bbb.php?id=1002 = 一意のキーid=1002の値で出力出来る、MySQL上のデータをHTML化したもの 例n)http://domain.jp/bbb.php?id=nnnn = 一意のキーid=nnnnの値で出力出来る、MySQL上のデータをHTML化したもの 2.無かったら、 (a) http header 401を出力 (b) aaa.php(フォームログイン画面)にリダイレクトする。 一応、ここ迄はいいのですが、例えば、利用者が、上記例2のURLをブラウザ「お気に入り」で保存しておき、直接そのページをみたい、と言った時、リンク指定先のbbb.phpは、 ・ そのユーザがログインしていない場合(Cookieが無い場合)、aaa.phpのログインフォームへリダイレクトする ・ aaa.phpは認証後、リンク集ページを出力する、 といった動作になってしまいます(てゆうかそうゆう作りなんで当たり前ですが・・・)。 そこで、aaa.phpの機能で、 ・ 「どのURLから、リンク(リダイレクト)されてきたかを判定するロジック」を入れ、もし、「bbb.php?id=xxxx」だったら、 ・ 認証OK後、直接、そのbbb.phpが出力するHTMLのURL(http://domain.jp/bbb.php?id=xxxx)に、再度リダイレクトする処理を入れれば良い?、 のかなーと短絡的に考えました。 で、問題となるのが、aaa.phpが表示された時、どこからリダイレクトされてきたか(リダイレクト元のURL)を知る方法です。 そこで、PHPの、$_SERVER[HTTP_REFERER]を入れてみた所、 ・ bbb.phpにリダイレクトされる前のURLが、$_SERVER[HTTP_REFERER]に入っている(多分、別のHTMLのbbb.php?id=~へのリンク集?) ・ $_SERVER[HTTP_REFERER]の中が空(URL直接指定?) という現象で詰まってしまいました。 ここから抜け出す為、何か良いアイディア(別の方法、関数等)があればお知恵拝借したいと考えています(書いてある事を理解して頂ける文章か今イチ不安ですが・・・)。 何卒よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
セッションの方が簡単そうだしそっちでいいのではと。
その他の回答 (2)
- tany180sx
- ベストアンサー率63% (239/379)
リファラを見るよりセッションに保存しておくか、 header('Location: login.php?url=現在のURL'); で飛ばしてログインフォームでその値を見るとか。 後者の場合は、urlのエスケープ処理、永久ループ回避が必要です。
お礼
ログインフォームのCGIに、新たにgetパラメタをつける方法、というのも、見た目がわかり易そうでいいですね。やるとしたら、エスケープは面倒そうなので、base64かなんかで文字列化すれば、decode、encodeの関数もあったと思うので、URLの使いまわしは楽そうです。 ただ、seimurakamさんからも教えて頂いた様に、セッションに保存して、値を別のCGIで使いまわす、といった方法と、どちらがベターかつオーソドックスな方法なんでしょうか・・・? ご回答ありがとうございました。
- seimurakam
- ベストアンサー率61% (21/34)
さらっと書いてしまうと、 >この時、aaa.phpが認証OKの証?として出力したCookieが、 こういった機構ではクッキーよりもセッションを使用した方が セキュリティ上も好ましいと思うのですが、 クッキーにこだわる理由はありますか?
お礼
回答有難うございます。 > クッキーにこだわる理由はありますか? 全くありません。 認証を経ずbbb.php?id=xxxxにアクセスしてきたら、bbb.phpの方で、 $_SESSION['redirect_moto_URL'] = "http://domain.jp/bbb.php?id=nnnnx"; とかやってから、aaa.phpにリダイレクトし、aaa.phpは、 $_SESSION['redirect_moto_URL'] の値を取り出して、使い回す、という様な事でしょうか?(合ってますか?) 何か補足して頂ける事があれば、またよろしくお願いします。
補足
ですよね。自分も簡単な方がいいです。 有難うございました。