• ベストアンサー

リファラのないカウントを防止

Perlについての知識がほとんどないのですが、あるCGIの改造に挑戦しています。 通常表示させる内容と、リファラのないアクセスの場合に表示させる内容を変える場合は、どのように書けばいいのでしょうか? if($ENV{'HTTP_REFERER'}){ リファラのない場合に表示させる内容。 } else { }

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

  • ベストアンサー
  • taseki
  • ベストアンサー率66% (155/233)
回答No.4

以下の、 > リファラのない場合のみアクセスを防止するように改造 とおっしゃる意味が、 ●「リファラのない」アクセスのみをカウント防止(IDに関係なく) という意味なら、 unless ($ENV{'HTTP_REFERER'}) { $nocount_flag = 1; } の1行だけで良いと思います。 ●「リファラのない」かつ「リストに含まれるID」のアクセスをカウント防止 (両方ともYESの場合にカウント防止) という意味なら、ANo.3さんの方法で良いと思います。 または以下のような書き方でも良いと思います。 $nocount_ids = '^' . join('$|^',(1,5,10)) . '$'; # アクセスを防止するIDのリスト if (!$ENV{'HTTP_REFERER' && $FORM{id} =~ qr{$nocount_ids}) { $nocount_flag = 1; } else { $nocount_flag = 0; } ●「リファラのない」アクセスと、「リストに含まれるID」のアクセスの両方をカウント防止 (1つ以上がYESの場合にカウント防止) という意味なら、 @nocount_id = (1,5,10); # アクセスを防止するIDのリスト $nocount_flag = 0; if ($ENV{'HTTP_REFERER'}) { foreach $linkid(@nocount_id) { if ($linkid == $FORM{id}) { $nocount_flag = 1; last; } } } else { $nocount_flag = 1; } または以下のような書き方でも良いと思います。 $nocount_ids = '^' . join('$|^',(1,5,10)) . '$'; # アクセスを防止するIDのリスト if (!$ENV{'HTTP_REFERER' || $FORM{id} =~ qr{$nocount_ids}) { $nocount_flag = 1; } else { $nocount_flag = 0; }

MKNET
質問者

お礼

ご回答ありがとうございました。知識のない私でも理解できるよう、詳しくご説明してくださり大変助かりました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • mflow
  • ベストアンサー率63% (42/66)
回答No.3

あ、処理が逆になってましたねw しかも、質問のタイトルをよく読んでませんでした。 酔っ払いイクナイ。 で、本題。 @nocount_id = (1,5,10); # アクセスを防止するIDのリスト $nocount_flag = 0; unless($ENV{'HTTP_REFERER'){ foreach $linkid(@nocount_id) { if ($linkid == $FORM{id}) { $nocount_flag = 1; last; } } }

MKNET
質問者

お礼

ご回答ありがとうございました。おかげ様で解決することができました。

すると、全ての回答が全文表示されます。
  • taseki
  • ベストアンサー率66% (155/233)
回答No.2

それでは逆ですね。 『リファラの“ある”アクセスの場合に~』という条件式になってしまっています。 なので、リファラが“ない”場合には else の方が実行されます。 if ($ENV{'HTTP_REFERER'}) {   リファラの“ある”アクセスの場合の処理 } else {   リファラの“ない”アクセスの場合の処理 } 上記はリファラの“ある”場合と“ない”場合の両方ともを分岐して処理していますが、リファラの“ある”場合だけでいいなら、else 以後は不要です。 リファラの“ない”場合だけでいいなら、条件式を逆の意味に変更します。 式の前に「not」つまり「否定」を意味する「!」を付けると逆の条件、すなわち『リファラの“ない”アクセスの場合に~』という意味になります(notと書いても良い)。   ↓ここに「!」を入れる if (!$ENV{'HTTP_REFERER'}) {   リファラの“ない”アクセスの場合の処理 } あるいは、 unless ($ENV{'HTTP_REFERER'}) {   リファラの“ない”アクセスの場合の処理 } ※両方の処理が必要なら if 文を使います。

MKNET
質問者

お礼

ご回答ありがとうございます。大変勉強になりました。アドバイス頂いた内容を元に、改造した内容を、mflowさんへのお礼に書込みしました。このような書き方でよろしかったでしょうか。宜しくお願いいたします。

すると、全ての回答が全文表示されます。
  • mflow
  • ベストアンサー率63% (42/66)
回答No.1

それであってますよ。 けど、elseでつないでしまうとソースが煩雑になりがちなので以下のようにしてみたらどうでしょうか。 unless($ENV{'HTTP_REFERER'}){ print "Content-type: text/html\n\n"; print "リファラがない場合の表示"; exit; } # 通常の処理を書く

MKNET
質問者

お礼

ご回答ありがとうございます。大変勉強になりました。アドバイス頂いた内容を元に、改造してみました。 @nocount_id = (1,5,10); # アクセスを防止するIDのリスト $nocount_flag = 0; foreach $linkid(@nocount_id) { if ($linkid == $FORM{id}) { $nocount_flag = 1; last; } } 上記スクリプトで指定されたIDのアクセスを防止できるのですが、リファラのない場合のみアクセスを防止するように改造しようと考えました。以下のように変更してみましたが、よろしかったでしょうか。お手数ですが、宜しくお願いいたします。 @nocount_id = (1,5,10); # リファラのないアクセスを防止するIDのリスト if(!$ENV{'HTTP_REFERER'}){ $nocount_flag = 0; } else { $nocount_flag = 1; } foreach $linkid(@nocount_id) { if ($linkid == $FORM{id}) { $nocount_flag = 1; last; } }

MKNET
質問者

補足

ちなみに、 意味もわからず、$nocount_flag = 0;を1に変更してみましたが、4行目の if ($linkid == $FORM{id}) { $nocount_flag = 1; last; } の数値「1」はこのままでいいのでしょうか。 わからないことだらけで恐縮です。

すると、全ての回答が全文表示されます。

関連するQ&A