「みんな教えて! 選手権!!」開催のお知らせ

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

if($ENV{'HTTP_REFERER'}){
リファラのない場合に表示させる内容。
} else {
}

A 回答 (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; }
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/20 20:33

あ、処理が逆になってましたね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;
}
}
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/20 20:32

それでは逆ですね。


『リファラの“ある”アクセスの場合に~』という条件式になってしまっています。
なので、リファラが“ない”場合には else の方が実行されます。

if ($ENV{'HTTP_REFERER'}) {
  リファラの“ある”アクセスの場合の処理
} else {
  リファラの“ない”アクセスの場合の処理
}

上記はリファラの“ある”場合と“ない”場合の両方ともを分岐して処理していますが、リファラの“ある”場合だけでいいなら、else 以後は不要です。

リファラの“ない”場合だけでいいなら、条件式を逆の意味に変更します。
式の前に「not」つまり「否定」を意味する「!」を付けると逆の条件、すなわち『リファラの“ない”アクセスの場合に~』という意味になります(notと書いても良い)。

  ↓ここに「!」を入れる
if (!$ENV{'HTTP_REFERER'}) {
  リファラの“ない”アクセスの場合の処理
}

あるいは、

unless ($ENV{'HTTP_REFERER'}) {
  リファラの“ない”アクセスの場合の処理
}

※両方の処理が必要なら if 文を使います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/20 05:50

それであってますよ。


けど、elseでつないでしまうとソースが煩雑になりがちなので以下のようにしてみたらどうでしょうか。

unless($ENV{'HTTP_REFERER'}){
print "Content-type: text/html\n\n";
print "リファラがない場合の表示";
exit;
}

# 通常の処理を書く

この回答への補足

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

補足日時:2006/10/20 06:02
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。大変勉強になりました。アドバイス頂いた内容を元に、改造してみました。

@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; }
}

お礼日時:2006/10/20 05:49

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


おすすめ情報