• 締切済み

関数について

if文にてリファラーのパターンマッチを行って、どちらの場合もhtmlを表示したい場合、関数はprintでいいのでしょうか。 どなたか解る方、ご判断お願い申し上げます。 <記述例> #!/usr/bin/perl my $ref = $ENV{'HTTP_REFERER'}; # topb.htmlを表示するためのHTTP_REFERER値を設定 if ( $ref =~ '特定のリファラーを含むURL' ){ print "topb.html"; } else {  print "topa.html"; } }

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

みんなの回答

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

URLをそのままにしたい場合(アクセスログが無意味になるやり方なのでCGI内でリファラ別に記録を取ったほうが良い)は #!/usr/bin/perl my $ref = $ENV{'HTTP_REFERER'}; my $keywords = 'キーワード1|キーワード2|キーワード3|キーワード4|キーワード5'; ## 特定のリファラーを含むURL ## デフォルトページファイル my $F_NAME = "topa.html"; ## 条件によりHTML変更 if( $ref =~ /$keywords/ ){ $F_NAME = print "topb.html"; } ## if文条件記述を少し正確にしてアレンジしてみました:仕事でログ解析に使えます ## HTML読み込み出力 print "Content-type: text/html\n\n"; open(INHTML,$F_NAME); while(<INHTML>){ print; } close(INHTML); 蛇足ですがリファラはHTTPでは必須の要素ではないため隠蔽されていることが多いです。

estimaster
質問者

お礼

早速のご回答有難うございました。 ご丁寧な対応感謝いたします。 是非参考にさせて頂きたいと思います。

  • atom_seed
  • ベストアンサー率48% (25/52)
回答No.1

指定したHTMLへジャンプさせるのであれば print "Location: topb.html", "\n\n"; exit; のように書きます。 HTML名のところはできればhttp://から書いたほうが良いです。

estimaster
質問者

お礼

早速のご回答感謝いたします。 htmlを表示させる場合はLocationなんですね。 「HTML名の~」というのはLocationのあと部分をさしていると解釈いたします。 有難うございました。

関連するQ&A

  • 表示画面が真っ白になる場合、何が問題なのでしょうか。

    現在、携帯向けHPを作成しております。 目的と流れは下記の通りといたしますが、上手く稼動しません。 どのような問題が起こっているのでしょうか。 <目的> 特定のリファラーを含むユーザーにはtopb.htmlを表示 上記以外のユーザーにはtopa.htmlを表示(コンテンツのトップページ) <流れ> 1.トップページをindex.shtmlとし、記述内容は次のとおりです。 <html> <head> <title></title> </head> <body> <!--#exec cgi="index.pl"--><br> </body> </html> パーミッションは755 2・上記目的を実行するためのperlプログラムの内容は次の通りです。 #!/usr/bin/perl my $ref = $ENV{'HTTP_REFERER'}; # topb.htmlを表示するためのHTTP_REFERER値を設定 if ( $ref =~ '特定リファラー' ){ print "location: topb.html"; } else {  print "location: topa.html"; } } パーミッションは755 以上です。 上記をサーバーにアップし、アクセスすると一文字も表示されない真っ白なページになってしまいます。 いろいろな方のご意見を頂戴し、専門誌を読んで学習して参りましたが、最後の部分で躓いております。 当方cgi及びperl初心者のため、上記に重複などがみられた場合はご了承ください。 追記 特定リファラーは複数を指定したいと考えておりますが、その場合 「'特定リファラー1|特定リファラー2'」とすればいいのでしょうか。 宜しくお願い申し上げます。

    • 締切済み
    • CGI
  • リファラのないカウントを防止

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

    • ベストアンサー
    • Perl
  • 正規表現のパターンに変数を指定したい

    perlでパターンマッチを行う際、正規表現で行いますが、パターン文字列内に変数を指定したい場合はどうすればよいのでしょうか? if ($ENV{HTTP_USER_AGENT} =~ /$pattern/) {  : } というようなことをしたいのですが、うまくいきません。 方法はありますでしょうか?

    • ベストアンサー
    • Perl
  • 正規表現について

    いつもお世話になっております。 perlの正規表現で分からない事があります。 ご存知の方がいらっしゃれば、アドバイスを頂けますようよろしくお願い致します。 (質問内容) 以下のようなプログラムを実行した場合、matchが出力されてしまいます。 $aには、「、IS」を設定しているので、「真」と扱われないと思うのですが、何故、matchが出力されるのでしょうか? また、「偽」として処理をいしたい場合、 どのようにすればよろしいのでしょうか? #!/usr/bin/perl $a = "、IS"; $b = "AIS"; if ($a =~ $b){ print "match\n"; } else{ print "not match\n"; }

  • 他サイトからの拒否

    #!/usr/bin/perl #-----同じようにいくつも追加できます。基本的にトップページを指定します $InURL[0] = "http://xxxxx.s101.xrea.com/"; local($match) = 1; foreach (@InURL) { if ($ENV{'HTTP_REFERER'} =~ /$_/) { $match=0; last; } } if ($match) { print "Content-type: text/html\n\n"; print "<html><body><center>直リンク禁止。</center></body></html>"; exit; } http://xxxxx.s101.xrea.com/以外のサイトからアクセスすると、 直リンク禁止になるのですが、 最近、search.msn.comの足跡が残っていて、 直接このCGIにアクセスとしてました。 私にはわからないですが、 http://xxxxx.s101.xrea.com/に成りすまして、アクセスとしているとしか考えられません。 そんな事が出来るのでしょうか。 それと、PERLの指定に何か不具合があるのでしょうか。 対処方法を教えて下さい。 よろしくお願いいたします。

    • 締切済み
    • CGI
  • use encodingによって正規表現の結果が変わる?

    お世話になります。 webシステムで、画面入力値のチェックをperlで行っているのですが、 今回、perlのバージョンアップ対応を行っており、ソース修正をしたところ、以下のような現象に悩まされて困っております。 (本当のソースはもっと長いのですが、以下の現象により入力チェックが正常に動作しないという点までは突き止めました。) バージョン perl v5.8.0 os Red Hat Linux release 9 現象 use encodingが指定されていると、正規表現の$が効かないようです。 ソースと実行結果1 #!/usr/bin/perl #use encoding "euc-jp"; if ('apple' =~ /e$/) { print ("match\n"); } else { print ("unmatch\n"); } このときは match と表示されます。 ソースと実行結果2 #!/usr/bin/perl use encoding "euc-jp"; if ('apple' =~ /e$/) { print ("match\n"); } else { print ("unmatch\n"); } このときは、unmatch と表示されます。 対処方法のヒントだけでも頂けると助かります。 (他の質問を検索してみましたが、同様なものを見つけることができませんでした。) もしかして、perlのバグなのでしょうか?

    • ベストアンサー
    • Perl
  • perl で環境変数を表示できない

    perlの初心者です。下記のCGIを実行しましたが、全く表示しません。 最初の「環境変数」と言う文字も表示しません。 どこか初歩的なエラーがあると思いますが、わかりませんので質問させていただきます。 --- #!/usr/local/bin/perl print "Content-type: text/html", "\n\n"; print "<HTML><BODY>", "\n"; print "<H1>環境変数</H1><HR>", "\n"; foreach my $key( keys %ENV ){ print "$key: $ENV{$key}<BR>", "\n"; } print "<HR>", "\n"; print "</BODY></HTML>", "\n";

    • ベストアンサー
    • Perl
  • 環境変数の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
  • リンク元制限

    同じような機能で使いやすいスクリプトがPerlでは見つからなかったため、phpのスクリプトを初めて設置してみました。 それで、phpの改造方法がわからなくて困っております。 以下Perlのサブルーチンのようなものを、配布されているphpに付け足して、リンク元制限を行いたいと考えていますが、phpでも同じようなことができますでしょうか?できるのでしたら方法を教えていただければ幸いです。宜しくお願いいたします。 sub referer{ $InURL[0] = "http://a.domain.com"; $InURL[1] = "http://b.domain.com"; local($match) = 1; foreach (@InURL) { if ($ENV{'HTTP_REFERER'} =~ /$_/) { $match=0; last; } } if ($match) { if ($lockflag) { &unlock; } print ""; exit; } }

    • ベストアンサー
    • PHP
  • プロトタイプ宣言のワーニングについて

    関数のプロトタイプ宣言と、それに関するwarningsプラグマについてお教えください。 関数のプロトタイプ宣言は、その関数を呼び出す側がコンパイルされる時点で、すでに存在する必要があり、また、use warningsによってプラグマを有効にしておくと、遅いプロトタイプ宣言について警告してくれると理解していました。 以下の2例は、どちらもプロトタイプ宣言が遅いために、うまくプロトタイプが働かない例です。 しかし、(例1)ではwarningが表示されるのに対し、(例2)では表示されません。 どこか私の理解が誤っているのかと思うのですが、このようになる理由についてご教授いただきたく、よろしくお願いいたします。 ■ (例1) #!/usr/bin/env perl # -*- mode: cperl; coding:utf-8 -*- use strict; use warnings; my @a= 1..4; mypush( @a, 5..8); print join( ",", @_), "\n"; sub mypush(@@){ if( @_== 2){ print "ok.\n"; }else{ print "Prototypes does not work, arg. num=", 0+ @_, "\n"; } } □(出力1) main::mypush() called too early to check prototype at ./chk_prototype.pl line 10. Prototypes does not work, arg. num=8 ■(例2) #!/usr/bin/env perl # -*- mode: cperl; coding:utf-8 -*- use strict; use warnings; test_2(); exit 0; sub test_2{ my @a= 1..4; mypush( @a, 5..8); print join( ",", @_), "\n"; } exit 0; sub mypush(@@){ if( @_== 2){ print "ok.\n"; }else{ print "Prototypes does not work, arg. num=", 0+ @_, "\n"; } } □(出力2) Prototypes does not work, arg. num=8 ---- なお、Perlは、 perl -v This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi を使用しております。

専門家に質問してみよう