- 締切済み
表示画面が真っ白になる場合、何が問題なのでしょうか。
現在、携帯向け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'」とすればいいのでしょうか。 宜しくお願い申し上げます。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- umasikajiro
- ベストアンサー率67% (545/803)
前の回答や他の選択肢とごっちゃになっているのでは? もういちど整理して書き直します。 #5の選択肢2.で htmlファイルのパーミッションを600にする場合 *-- .htaccessの内容--- DirectoryIndex index.cgi --以上の1つだけ (CGIを動かすためにOptions ExecCGI や AddHandler cgi-script .cgi .pl と言う記述が必要ならそれも合わせて 最大でも3行の記述) *-- index.cgi の内容(最小限のサンプルです) #! /usr/bin/perl print"Content-type: text/html\n\n"; my $ref = $ENV{'HTTP_REFERER'}; if ( $ref =~ m!(hoge.example.com/HOGE_A|hoge.example.com/TEST_B)! ) { print `cat topb.html`; } else { print `cat topa.html`; } __END__ `cat topa.html` の ` はバッククォートです(Shiftを押しながら@キー) 勿論 open文を使って htmlを読み込み=>表示でもいいですが Locationヘッダではなく Content-typeヘッダを表示=>REFERERで分岐=>条件に合う方のhtmlを読み込んで表示です これで うちのほうで(Linux+apache2.2+Suexec有効)でパーミッションは cgi= 700 html = 600 で行けてますよ 前の回答と混同して Locationヘッダでtopa.html に飛ばしているのなら cgiでの読み込みではなく htmlに直接ブラウザがアクセスすることになりますので 当然、アクセス出来ません 尚、htmlファイルを設置せずに HTML文をcgiスクリプト中に記述して それを表示することも出来ますが htmlの内容を変更したり 表示の確認(サーバー上ではなくあなたのPC上での確認ですが)をするために不便なので 別fileで読み込む方法を取っています
- umasikajiro
- ベストアンサー率67% (545/803)
>・ topa.html の頭に . を付け .topa.html 等とする >(ファイル名を付けろとエラーになります。) windows上だとそう成りますので コマンドラインでさーばーにログイン出来るなら $ mv topa.html .topa.html <=と打ってEnter (ls でfile一覧から消えます 見るときは ls -al) FFFTPなら Fileを右クリックして名前変更 もしこれでも直接 .topa.html にブラウザでアクセスできてしまう場合は .htaccessに <Files ~ "^\..*"> Order allow,deny Deny from all </Files> と追記してください >・または Suexecを使っているサーバーなら topa.html のパーミッションを 600 などにする >(サーバーはSuexecを使用しているのですが600にするとhtmlが表示されなくなります。) 表示されないのは 直接ブラウザでアクセスしているのでは? Suexec環境のCGIはユーザー権限で動くので600のfileを読み込むことが出来ます と言うか CGIから読み込んで表示したときだけ内容が見えて 直接アクセスさせたくないために 600にするのですから期待通りの正常な現象ですよ
お礼
ご回答有難うございます。 毎回同じようなことばっかりで申し訳ありません。 ファイル名の変更はできました。 この場合はcgi内の記述にもそれぞれ.を加えるということでいいのですね。 でないとアクセス自体ができません。 <Files ~ "^\..*"> ~ を追記するについては同じくアクセスができなくなってしまうのでいまのところ実行しておりません。 (指定IP以外のアクセスを許可しない記述があるためでしょうか。各キャリア機種別IPと自分のPCのIPです。) あと「直リンク禁止」などのサイトを見たりして勉強したのですが、どうしても600でのcgi読み込みができません。なぜでしょうか。 そのため、いまはcgi755 html644(tppb) shtml644(topa)にしてあります。 サーバーは確かにSuexecに対応しています。
- umasikajiro
- ベストアンサー率67% (545/803)
*選択肢1. #3に書いた .htaccessの中の RewriteRule ^$ /~tarou/topb.html [R=302,L] を RewriteRule ^$ /~tarou/topb.html [PT,L] とすれば URLはそのままで表示される内容だけがtopb.htmlの中身となります アクセス統計に関してはサーバーのログ(バーチャルサーバーなら別途業者が用意しているはず) を見るしか無いですね。 *選択肢 2.index.cgiですべて行う まず .htaccess に DirectoryIndex index.cgi と記述して http://example.co.jp/ へのアクセスは index.cgiで処理します 別途 topb.html と topa.html を用意して cgiの中で条件に合うほうの htmlを読み込んで表示します。 >これがクリックされた場合、広告会社にはtopa.shtmlの情報は行くのでしょうか。 今、念のため試してみましたが 選択肢1. 2.とも URLがそのままですので そのページに表示されるリンクをクリックしても http://example.co.jp/ と言うREFERERしか渡りませんで topa.html などは入りません 但し 直接 http://example.co.jp/topa.html にアクセスされた場合は別で それをも対策するなら 選択肢 2.のCGIで行う場合は ・ topa.html の頭に . を付け .topa.html 等とする (通常は直接出来ないが CGIからの読み込みは可能) ・または Suexecを使っているサーバーなら topa.html のパーミッションを 600 などにする (括弧内 同上) 選択肢 1. のrewriteで行うなら 「rewrite 直リンク禁止」 と言うキーワードで検索すれば説明ページがたくさんあります
お礼
ご報告 このたびは大変お騒がせいたしました。 ご助力頂きました結果、当初の目的としておりました作業が無事終わりました。 有難うございます。 結果的には選択肢2を使用し、現在稼動しております。 これからの課題として ・ topa.html の頭に . を付け .topa.html 等とする (ファイル名を付けろとエラーになります。) ・または Suexecを使っているサーバーなら topa.html のパーミッションを 600 などにする (サーバーはSuexecを使用しているのですが600にするとhtmlが表示されなくなります。) ひとつ心配なのが、サーバーでアクセスログ内のリファラーを確認したのですが/topa.shtmlと記載がありました。 上記2つのうち、どちらかを実行すれば解消されるものと奮起しております。 しつこいようですが、心より感謝いたします。 有難うございました。
補足
お返事有難うございます。 htaccessにて処理することにしました。 早速、ご指示いただきました記述で試してみました。 <IfModule mod_rewrite.c> RewriteEngine On # REFERERにtest0やtest2が含まれる場合はtest10に飛ばす RewriteCond %{HTTP_REFERER} 'http://www.yahoo.co.jp' [OR] RewriteCond %{HTTP_REFERER} 'http://www.google.com' RewriteRule ^$ /~http://******.ne.jp/topb.html [PT,L] </IfModule> DirectoryIndex topa.html topa.htmlは表示されるのですがtopb.htmlはリファラー値を指定しても表示されないんです・・。 上記の場合のtest10とはどこを指すのでしょうか。 これが成功すればもうお手を煩わすことはないと思います。 宜しくお願い申し上げます。 追伸 広告の件、テストまでしていただき、大変助かりました。 心より感謝申し上げます。
- umasikajiro
- ベストアンサー率67% (545/803)
う~んん説明の仕方が悪かったかな 1.SSIを使って 有効なLocationヘッダを出力することは出来ません 2.exec cgiでLocationヘッダを出力すると <A HREF タグに置換されます 3. exec cmd だとHTML文中に "Location: 指定したURL \n\n"と言う文字列が表示されるだけでジャンプはしません で、一旦 とにかく index.shtmlにアクセスした上で a.html かb.htmlにアクセスさせたいと言うことでしたら index.pl の中身---- #! /usr/bin/perl my $ref = $ENV{'HTTP_REFERER'}; # topb.htmlを表示するためのHTTP_REFERER値を設定 if ( $ref =~ m!(URL1 | URL2)! ) { print '<meta http-equiv="Refresh" content="10;URL=./topa.html">'; } else { print '<meta http-equiv="Refresh" content="10;URL=./topb.html">'; } __END__ index.plは以上 index.shtmlの中身--- <html> <head> <!--#exec cmd="./index.pl" --> </head> <body>以下略 ---------- $ref =~ m!(URL1 | URL2)! についてですが 複数のURLにマッチさせたいのであればURL1 と URL2の部分に書きます URLには / が含まれることが多いので =~ // だと / を一々エスケープしなければいけないので / の代わりに ! を使い m! マッチする文字列 ! と言う形にします (別に ! じゃなくてもいいのですがこの場合は都合がよさそう) http://www.rfs.jp/sb/perl/05/m.html それからindex.shtmlですが <HEAD>~</HEAD>の間にMETAタグが表示されないと具合が悪いです (但しブラウザによっては <BODY>以下に書いてもジャンプするかもしれません) >アクセス数は合算させたい アクセスカウンターを使うと言う意味ならば#3に書いた方法では適当で無いですね アクセスカウンターではなく単に質問者さんがアクセス数などを知りたいのであれば SSIを使わず index.cgi を優先させるDirectoryIndexにして index.cgiの中身--- #! /usr/bin/perl #この辺に アクセスをログに記録する記述を書く my $ref = $ENV{'HTTP_REFERER'}; if ( $ref =~ m!(test2/|test0/)! ) { print "Location: http://example.com/topa.html\n\n"; } else { print "Location: http://example.com/topb.html\n\n"; } __END__ などと書けばすむかと思いますが
補足
有難うございます。 しっかりと画面が表示されるようになりました。 ご親切な対応に心より感謝いたします。 ここまで助けて頂いたのであとは自力でやってみようかと思います。 課題となりますのはコンテンツのトップページでURLを参照するとやはりtopa.shtmlやtopb.htmlと表示されてしまうことです。 どちらもトップページは~.co.jpで表示させたいんです。 ジャンプではなくSSIにて振分けを目標に頑張ります。 直接の面識はないですが、知人がこのような手法で携帯HPを運営しているので出来ない事は無いみたいなんです・・・ 余談ですが、コンテンツのトップページ(topa.shtml)にクリック保障型広告が貼ってあります。 これがクリックされた場合、広告会社にはtopa.shtmlの情報は行くのでしょうか。 行くのであれば注意を受ける前に何らかの変更をしなければと思いまして。 すみません。 甘えていろいろ聞いちゃいました。
- umasikajiro
- ベストアンサー率67% (545/803)
.htaccessが使えるのであれば以下のように記述してください (既に.htaccessがあるなら 追記する 基本のURLが http://example.com/~tarou/ だとする) <IfModule mod_rewrite.c> RewriteEngine On # REFERERにtest0やtest2が含まれる場合はtest10に飛ばす RewriteCond %{HTTP_REFERER} test0 [OR] RewriteCond %{HTTP_REFERER} test2 RewriteRule ^$ /~tarou/topb.html [R=302,L] </IfModule> DirectoryIndex topa.html #----以上---- もし .htaccessでRewriteが使えない場合でも index.cgiかindex.phpがDirectoryIndexに使えるなら方法はありますので 補足にお書きください それも駄目なら #1さんが書かれたようにMETAタグかJavaスクリプトを表示するCGIにするしかないですね それから >print "location: topa.html"; print "Location: http://example.com/~tarou/topa.html\n\n"; #特に末尾の\n\nが無いとそもそもヘッダとして認識されません #LocationヘッダのURLは 完全なURLが間違いないです あと#1さんの > <!--location: topb.html--> いや、それが違うのですよ <!--#exec cgi="index.pl"-->でindex.plがちゃんと動いていたら <A href="topb.html">と言うように A hrefタグに置換されます exec cgiではなく <!--#exec cmd="./index.pl"-->だと置換はされませんので HTML文中に topb.html が表示されます
補足
早速のご回答心より感謝いたします。 DirectoryIndexにindex.cgiは使用可能です。 ご指摘頂きました箇所を修正いたしました。 ■index.shtml <html> <head> <title></title> </head> <body> <!--#exec cmd="index.pl"--><br> </body> </html> ■index.pl #!/usr/bin/perl my $ref = $ENV{'HTTP_REFERER'}; # topb.htmlを表示するためのHTTP_REFERER値を設定 if ( $ref =~ '特定リファラー値' ){ print "Location: http://**************.ne.jp/topb.shtml\n\n"; } else { print "Location: topa.shtml"; } } 上述で合ってますでしょうか。 目的をもう一度整理いたしますと 特定リファラーを含むユーザーに対してtopb.shtmlを表示します。(topb.shtmlには任意で他のサイトに飛ばせるようなリンクを設置します。) 特定リファラーを含まないユーザーにはコンテンツ(待受や着メロサイトを予定しています)のトップページであるtopa.shtmlを表示します。 但し、アクセス数は合算させたいと考えておりますので、SSIを使用しどちらの場合も同一URLへのアクセスとします。 初心者のくせに偉そうなこと言ってすみません。 topaもしくはtopb、どちらを表示する場合も同じURLにするというのが最大の目的であります。 お力添え頂けましたら幸いです。 宜しくお願い申し上げます。
- osamuy
- ベストアンサー率42% (1231/2878)
SSIが有効になってないとか。 そうでなくても、HTMLのbody内にHTTPヘッダー情報書いても機能しないのではないかなあ、と。
- _himajin_
- ベストアンサー率65% (128/195)
ブラウザでindex.shtmlを表示してソースを開いてみてください。たぶん以下のような感じになってると思います。 <html> <head> <title></title> </head> <body> <!--location: topb.html--><br> </body> </html> locationはhttpヘッダで通知しないといけないので、この方法では無理です。 ・携帯のブラウザが対応してるかわからないですが、metaタグ(http://www.tagindex.com/html_tag/page/meta_05.html)を出力するスクリプトにするか ・HTMLを書き換える(リファラによってどちらかのファイルを読んで書き出す)ようなスクリプトにするか ・あるいはindex.pl自体にアクセスが行くようにするか いずれかの方法にしなければならないと思います。
補足
早速のご回答有難うございます。 index.shtmlですが<!--#exec cgi="index.pl"-->となっています。 板違いかもしれませんがperlの記述は合ってますでしょうか。 パーミッションやその他はチェックしてみたんですが・・。 おそらく、perlの記述が間違っていなければ index.shtml→topb.html ↓ topa.html とSSIによって振分けられるはずなんです。 すみません。
お礼
umasikajiro様 有難うございます!! 今回のお返事で全て解決いたしました。 パーミッションは700と600で稼動しますし、アクセスしたときにtopa.shtmlなど表示されなくなりました。 感動です!! htaccess内にAddHandler cgi-script .cgi .plの記述もいらないみたいです。 本当に有難うございました。 今回の件でいろいろなサイトや掲示板で質問をいたしましたがここまで親切ご丁寧にしていただいたのは初めてです。 教えていただいたことをしっかり復習し、今後に繋げたいと思います。 有難うございました。