• ベストアンサー

リダイレクト元の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直接指定?)  という現象で詰まってしまいました。  ここから抜け出す為、何か良いアイディア(別の方法、関数等)があればお知恵拝借したいと考えています(書いてある事を理解して頂ける文章か今イチ不安ですが・・・)。  何卒よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.3

セッションの方が簡単そうだしそっちでいいのではと。

task2easy
質問者

補足

ですよね。自分も簡単な方がいいです。 有難うございました。

その他の回答 (2)

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.2

リファラを見るよりセッションに保存しておくか、 header('Location: login.php?url=現在のURL'); で飛ばしてログインフォームでその値を見るとか。 後者の場合は、urlのエスケープ処理、永久ループ回避が必要です。

task2easy
質問者

お礼

 ログインフォームのCGIに、新たにgetパラメタをつける方法、というのも、見た目がわかり易そうでいいですね。やるとしたら、エスケープは面倒そうなので、base64かなんかで文字列化すれば、decode、encodeの関数もあったと思うので、URLの使いまわしは楽そうです。  ただ、seimurakamさんからも教えて頂いた様に、セッションに保存して、値を別のCGIで使いまわす、といった方法と、どちらがベターかつオーソドックスな方法なんでしょうか・・・?  ご回答ありがとうございました。

回答No.1

さらっと書いてしまうと、 >この時、aaa.phpが認証OKの証?として出力したCookieが、 こういった機構ではクッキーよりもセッションを使用した方が セキュリティ上も好ましいと思うのですが、 クッキーにこだわる理由はありますか?

task2easy
質問者

お礼

回答有難うございます。 > クッキーにこだわる理由はありますか?  全くありません。  認証を経ず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']  の値を取り出して、使い回す、という様な事でしょうか?(合ってますか?)  何か補足して頂ける事があれば、またよろしくお願いします。