こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

リダイレクト元の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直接指定?)
 という現象で詰まってしまいました。

 ここから抜け出す為、何か良いアイディア(別の方法、関数等)があればお知恵拝借したいと考えています(書いてある事を理解して頂ける文章か今イチ不安ですが・・・)。

 何卒よろしくお願いします。

投稿日時 - 2009-09-16 22:46:25

QNo.5296135

困ってます

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

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

投稿日時 - 2009-09-18 19:02:29

補足

ですよね。自分も簡単な方がいいです。

有難うございました。

投稿日時 - 2009-09-20 00:12:25

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

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

投稿日時 - 2009-09-16 23:46:48

お礼

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

 ご回答ありがとうございました。

投稿日時 - 2009-09-18 01:46:29

ANo.1

さらっと書いてしまうと、

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

投稿日時 - 2009-09-16 23:40:42

お礼

回答有難うございます。
> クッキーにこだわる理由はありますか?
 全くありません。

 認証を経ず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']
 の値を取り出して、使い回す、という様な事でしょうか?(合ってますか?)
 何か補足して頂ける事があれば、またよろしくお願いします。

投稿日時 - 2009-09-18 01:35:48

あなたにオススメの質問