重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

表題わかりにくくてすいません。

商品ごとの申し込みフォームを作成しています。
まず、
$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が認識されてしまいます。ですが、最初のリファラーの値をずっと最後のページまで持っていたいのです。

どなたか、方法がわかりましたらご教授願います。よろしくお願いいたします。

A 回答 (4件)

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'}">

というようになります。
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2007/06/28 23:39

水を差すような回答ですが、リファラーは必ず送信されるわけではありません。


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

2番目のCGI「B.CGI」で取得した$ENV{'HTTP_REFERER'}をhiddenで次に送ってあげる方法ではダメなのでしょうか?


$ENV{'HTTP_REFERER'}の取得にこだわるのであれば何か特別な理由があるのでしょうか?

この回答への補足

回答ありがとうございます。
>>2番目のCGI「B.CGI」で取得した$ENV{'HTTP_REFERER'}をhiddenで次に送ってあげる方法ではダメなのでしょうか?

全然ダメじゃないです。説明不足でごめんなさい。
その場合、hiddenにはどのような記述をすればいいのかわかりません。

$ref=$ENV{'HTTP_REFERER'};をCGIの最初のほうに記述してから、
フォームボタンの上に
<input type="hidden" name="ref" value="$ref">\n";
とやってみましたが、これでは3ページ目以降のvalueの値は空になってしまいました。各ページへの持ち回りがうまくできません。
ご教授お願いいたします。

補足日時:2007/06/26 23:55
    • good
    • 0

環境変数はアクセス毎に変化するので環境変数だけでデータを永続保持できません。


セッション変数を使いましょう。
具体的な方法は CGI::Session で検索するとたくさんヒットします。
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2007/06/27 00:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!