• ベストアンサー

環境変数リファラーの値をを最後のページまで持ちたい。

表題わかりにくくてすいません。 商品ごとの申し込みフォームを作成しています。 まず、 $ENV{'HTTP_REFERER'};でどのURLのページから来たか判別させて、 その最初に入ってきたリファラーの値をページ遷移のときに最後の ページまでもっていきたいのです。 ■1ページ目(HTML)名まえ年齢、商品番号などを記入 <A.HTML> ■2ページ目(CGI)住所 <B.CGI> sub page2{} ■3ページ目(CGI)確認画面。<C.CGI> sub page3{} ■4ページ目(CGI)サンクスページ <D.CGI> sub thanks{} 以上の4ページの構成ですが、最初の1ページ目のHTMLが商品ごとにちがっていて、どの商品のページのHTMLからきているのか判別させて、サンクスページで、URLごとに別の件名の確認メールを自分あてに送信できるようにしたいので、最初のページがどのURLなのかをリファラーで判断させたいのです。商品によって、入力項目を変えるたりもしています。(POSTで商品ごとのhiddenタグを送ればいいと思うかもしれませんが、今回は$ENV{'HTTP_REFERER'};についてのやり方でやりたいのです。) ですが、$ENV{'HTTP_REFERER'};を2ページ目のサブルーチンのなかに記述しても2ページ目ではどこからきているのか$ref = $ENV{'HTTP_REFERER'};などと記述すればわかるのですが、この最初のリファラーの値を3ページ目、4ページ目に持っていくのにはどうしたらいいのでしょうか?全部のページのサブルーチンに$ref = $ENV{'HTTP_REFERER'};を書いてしまうと、そのひとつまえのURLが認識されてしまいます。ですが、最初のリファラーの値をずっと最後のページまで持っていたいのです。 どなたか、方法がわかりましたらご教授願います。よろしくお願いいたします。

  • Perl
  • 回答数4
  • ありがとう数2

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

  • ベストアンサー
  • danmarino
  • ベストアンサー率63% (26/41)
回答No.3

no.2の補足です。 2ページ目の「B.CGI」での記述は $ref=$ENV{'HTTP_REFERER'}; と <input type="hidden" name="ref" value="$ref"> でOKです。 3ページ目以降は、そのhiddenで渡されたものをvalueに記述してあげます。 ユーザーが入力したものやhiddenで渡されるものをどのように受け取っているかわからないので正確なお答えは出来ませんが、cgi-lib.plと&ReadParse;を使っているなら3ページ目のCGIでは <input type="hidden" name="ref" value="$in{'ref'}"> という感じになると思います。 cgi-lib.plを使っていないのなら if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/, $pair); $FORM{$name} = $value; } のようなロジックをご自分で書いているでしょうから(上記の場合は) <input type="hidden" name="ref" value="$FORM{'ref'}"> というようになります。

ken_0401
質問者

お礼

danmarino様のおかげで無事に解決しました。 素人に対して親切丁寧な回答をして いただきまして非常に感謝しております。 ありがとうございました。

その他の回答 (3)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.4

水を差すような回答ですが、リファラーは必ず送信されるわけではありません。 以前に読んだ「CGI プログラミング 第2版」(O'Reilly) に書いてあったのですが、 URL をキーボードから入力したりブックマークから選択した場合はリファラーは 送信されないとあります。実際に簡単なテストをしてみましたが、リンクをクリ ックした場合はリファラーは設定されましたが、ブックマークから選択した場合は 設定されませんでした。別の方法を考えるべきと思います。

  • danmarino
  • ベストアンサー率63% (26/41)
回答No.2

2番目のCGI「B.CGI」で取得した$ENV{'HTTP_REFERER'}をhiddenで次に送ってあげる方法ではダメなのでしょうか? $ENV{'HTTP_REFERER'}の取得にこだわるのであれば何か特別な理由があるのでしょうか?

ken_0401
質問者

補足

回答ありがとうございます。 >>2番目のCGI「B.CGI」で取得した$ENV{'HTTP_REFERER'}をhiddenで次に送ってあげる方法ではダメなのでしょうか? 全然ダメじゃないです。説明不足でごめんなさい。 その場合、hiddenにはどのような記述をすればいいのかわかりません。 $ref=$ENV{'HTTP_REFERER'};をCGIの最初のほうに記述してから、 フォームボタンの上に <input type="hidden" name="ref" value="$ref">\n"; とやってみましたが、これでは3ページ目以降のvalueの値は空になってしまいました。各ページへの持ち回りがうまくできません。 ご教授お願いいたします。

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.1

環境変数はアクセス毎に変化するので環境変数だけでデータを永続保持できません。 セッション変数を使いましょう。 具体的な方法は CGI::Session で検索するとたくさんヒットします。

ken_0401
質問者

お礼

回答ありがとうございます。 CGI::Sessionについて勉強してみたいと思います。 ありがとうございました。

関連するQ&A

  • 環境変数のHTTP_REFERERのチェック

    配布されたコードを見ているのですが、意味がわからないので 教えて下さい。 $referer_url[0] = 'http:\/\/localhost\/'; と宣言してあり、 そもそもlocalhostの意味もわかりません。 ##===================================== ## リンク元チェック処理 = ##===================================== if($REFERER_seigen == 1){   &ref_chk;   if ( $refchk==1 ){ #一致しなければ終了     print "エラー403";     exit;   } } という処理で、ref_chk関数を呼んでおりその中身が ##===================================== sub ref_chk{   $refchk = 1; #フラグの初期化(一致しない) = エラー403となる   foreach $url_temp(@referer_url){    if ( $ENV{'HTTP_REFERER'} =~ /^$url_temp/){     $refchk = 0; #前方が一致したのがあったらそのホストからだからOK    }   }   return $refchk; } とあります。前方が一致とはどういう意味でしょうか。

    • ベストアンサー
    • Perl
  • 環境変数HTTP_REFERERを使うには?

    ただ今、CGIで独自のアクセス解析プログラムを作成中です。 相手がアクセスしてきたら、メールに転送して情報を取得出来るようにしたんですが・・・・ リンク元を取得するのに以下のようにやってみたのですが、送られてきたメールは空メール(涙) ソース抜粋 $host = $ENV{'REMOTE_ADDR'}; $ref = $ENV{'HTTP_REFERER'}; open(MAIL,"| $sendmail $mailto"); flock(MAIL,2); print MAIL $host . $ref; flock(MAIL,8); close(MAIL); ホストアドだけを取得するとちゃんと情報が入って返って来るんですよね・・・ すみません、情報を取得できる良い方法は無いでしょうか?

  • HTTP_REFERERの値とセキュアーについて

    ジャンプしてきたURLを参照し、CGIの中に設定した値と一致した場合のみ次のページに移動できるCGIを使用しているのですが、httpsからはじまるAspプログラムからそのCGIをとおすと、上手くHTTP_REFERERの値をとってくれません。 CGIは、http://cgiroom.nu/の「KEEP OUT」というプログラムです。(参照:http://cgiroom.nu/list/level_up/keepout/index.htm) 作者の方の掲示板を調べたり、質問をしたりしているのですが、これ!という解決策がみつかりません。 サポート掲示板に「HTTP_REFERERの値」についてかかれたものがあり、セキュアーかASPの仕様と何か関係があるのでしょうか? 身近にプログラムについてくわしい方がいないため、とてもこまっています。どうか宜しくお願いいたします。

    • ベストアンサー
    • CGI
  • フレームページで HTTP_REFERER

    よろしくお願いいたします。 初心者ながらもHPを立ち上げ、Free配布のcgiもいくつか設置したのですが、 アクセス解析のcgiで、機能等に非常に満足のいくcgiが、参照元を取得するのに 「HTTP_REFERER」を使っていました。 私のHPは、フレームを使っておりまして、「HTTP_REFERER」では参照元が取得 出来ません。 どのようにすればよろしいのでしょうか?? ちなみに私の使っているサーバーは、HPとcgiが別サーバーとなっています。 解析するページからは『<img~~』で呼び出しています。

    • ベストアンサー
    • CGI
  • URLの一部を見てアクセス制限

    ある掲示板の改造で特定のURL以外からのアクセスを弾くものを作りたいのですが うまくいきません。 if($ENV{HTTP_REFERER} ne 'http://www.***.ne.jp/***.html(正規のリンク元)'){ if($ENV{HTTP_REFERER} ne 'http://www.***.ne.jp/***.cgi(掲示板のURL)'){ &error('不正アクセスです'); exit; } } で、始めはうまくいったのですが、掲示板で次のページに行こうとすると URLがhttp://www.***.ne.jp/***.cgi?page=2のように引数が付いてしまい、 不正アクセス扱いされてしまいます。 そこで、引数を覗いたhttp://www.***.ne.jp/***.cgiが含まれるもの全てを アクセス可能にしたいのですが、HTTP_REFERERとどのように一致させるのか わからないのです。 どのように記述すれば良いのでしょうか?

    • ベストアンサー
    • Perl
  • JavaScriptのwindow.openでリファラーが取得できない。

    <SCRIPT language="JavaScript"> <!-- function OpenWin(){ window.open("sample.cgi,"new","width=500,height=250"); } // --> <A href="#" onClick="OpenWin()">オープン</a> 上のようにsample.htmlのページ内にwindow.openのJavaScriptを書いています。 sample.cgi内に$ENV{'HTTP_REFERER'}を埋め込んでいるのですがリファラーが取得できません。 window.openの場合はリファラーは取得できないのでしょうか?

    • ベストアンサー
    • CGI
  • php 定義済み変数

    たとえばアクセス解析で、 $ref = $_ENV['HTTP_REFERER']; とした場合、リンク元があれば取得できますが、ブックマークからのアクセスの場合エラーになってしまいますよね? こんな感じである値を取得できなかった場合にエラーが出てしまうことを防ぐ書き方はあるのでしょうか? 教えてください。 (サーバーの設定は別としてください) (phpのバージョンは4.3.0です。)

    • ベストアンサー
    • PHP
  • アクセス解析でのHTTP_REFERERについて

    アクセス解析のCGIを作ってみようとがんばっています。そこでお伺いしたいのですが、 $ln = "$ENV{'HTTP_REFERER'}"; と単純にやればリンク元が取れると思っていたのですが、なぜか何度やってみてもHTTP_REFERERだけがだめでした。他の環境変数は問題なくファイルに書き出せるのですが、何をやってもリンク元の部分だけが空白になってしまいます。本をいくら読んでみてもわからず、ほとほと困り果ててこちらに参りました。 REFERERだけは保存するのに何か特別な処理が必要なのですか?解説が面倒なようでしたら Yes(処理が必要)/No(そんなことない君のスクリプトがどこかおかしい) だけでも構わないので教えていただけると有り難いです。 Tripodの無料HPを使っています。

    • ベストアンサー
    • Perl
  • htmlにコードを貼り、リファラーを取得したい

    外部のhtmlページに以下のコードを貼り付け、リファラーとアクセスページを取得しようと思っているのですが、うまくいきません。 ▼ htmlページに貼り付けたコード(外部サーバ) <script type="text/javascript" src="http://example.com/script.php"></script> ▼ script.php の 中身(自サーバ) $access_url= 'http://' . $_SERVER[HTTP_HOST] . $_SERVER[REQUEST_URI]; $referer_url = $_SERVER["HTTP_REFERER"]; [現在の状態] $access_url の中身 = http://自サーバのドメイン/script.php $referer_url の中身 = http://コードを貼り付けたページ 色々と試行錯誤してこの形になったのですが、完全に行き詰ってしまいました。 方向性だけでも良いので、どなたかご教授いただけませんでしょうか。 よろしくお願いいたしますm( _ _ )m

    • ベストアンサー
    • PHP
  • リファラーのデータ送信について

    こちらの質問(http://okwave.jp/qa3205563.html)で一定の解決を見たのですが、新たな問題が発生してしまったので教えてください。 sample.htmlへの記述 <script type="text/javascript"> var ref = document.referrer ; document.write("<script type=\"text/javascript\" src=\"​http://hoge.com.info.php?ref="+ref+"​\"></script>"); </script> で、refを送信したのですが、 受け取ったrefが、googleだと、 「http://www.google.co.jp/search?hl=ja」になってしまい、&で区切られている以降のデータ(つまり「q」)が取得できません。 別質問(http://okwave.jp/qa3200959.html)で、 hrm_mmmさんの回答======================================= $_SERVER['HTTP_REFERER']が対象ならば、以下で、$query_hashに、$_GETと同様のurldecode済みデータがハッシュ配列として得られます。 $url_hash = parse_url( $_SERVER['HTTP_REFERER'] ); if( array_key_exists( 'query', $url_hash ) and strlen($url_hash['query'])>0 ){ parse_str( $url_hash['query'], $query_hash); } // あとは、$url_hash['host'] によって切り分けて検索キー取り出しをすればよいと思います。 $word = ''; if( preg_match ("/\.google\./", $url_hash['host']) ) { $word = $query_hash['q']; } elseif( preg_match ("/\.yahoo\./", $url_hash['host']) ) { $word = $query_hash['p']; } elseif( preg_match ("/\.goo\.ne\.jp/", $url_hash['host']) ) { $word = $query_hash['MT']; } ====================ここまで============================ こんなんでやればいいよ。と教えていただいたのですが、グーグルから送られたref自体にqが入っていません。 というか、?以降の1番目のクエリーしか入ってきません。 ヤフーなら ?p=~でOK gooなら ?MT=~でOK google は hl=jaが一番最初にくるので、qがとれません。 なぜ、送信されてくるreferrerに2番目以降のパラメータがついてこないのでしょうか。。。 ちなみにsample.htmlで document.write(document.referrer)をやるとちゃんと全て表示されます。

専門家に質問してみよう