アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在、携帯向け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'」とすればいいのでしょうか。

宜しくお願い申し上げます。

A 回答 (7件)

ブラウザで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によって振分けられるはずなんです。
すみません。

補足日時:2008/05/25 02:21
    • good
    • 0

SSIが有効になってないとか。



そうでなくても、HTMLのbody内にHTTPヘッダー情報書いても機能しないのではないかなあ、と。
    • good
    • 0

.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にするというのが最大の目的であります。

お力添え頂けましたら幸いです。
宜しくお願い申し上げます。

補足日時:2008/05/25 05:35
    • good
    • 0

う~んん説明の仕方が悪かったかな


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の情報は行くのでしょうか。
行くのであれば注意を受ける前に何らかの変更をしなければと思いまして。
すみません。
甘えていろいろ聞いちゃいました。

補足日時:2008/05/25 09:53
    • good
    • 0

*選択肢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 直リンク禁止」 と言うキーワードで検索すれば説明ページがたくさんあります

この回答への補足

お返事有難うございます。
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とはどこを指すのでしょうか。
これが成功すればもうお手を煩わすことはないと思います。
宜しくお願い申し上げます。

追伸
広告の件、テストまでしていただき、大変助かりました。
心より感謝申し上げます。

補足日時:2008/05/25 22:12
    • good
    • 0
この回答へのお礼

ご報告

このたびは大変お騒がせいたしました。
ご助力頂きました結果、当初の目的としておりました作業が無事終わりました。
有難うございます。

結果的には選択肢2を使用し、現在稼動しております。
これからの課題として
・ topa.html の頭に . を付け .topa.html 等とする
(ファイル名を付けろとエラーになります。)  
・または Suexecを使っているサーバーなら topa.html のパーミッションを 600 などにする
(サーバーはSuexecを使用しているのですが600にするとhtmlが表示されなくなります。)

ひとつ心配なのが、サーバーでアクセスログ内のリファラーを確認したのですが/topa.shtmlと記載がありました。
上記2つのうち、どちらかを実行すれば解消されるものと奮起しております。

しつこいようですが、心より感謝いたします。
有難うございました。

お礼日時:2008/05/26 07:26

>・ 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にするのですから期待通りの正常な現象ですよ
    • good
    • 0
この回答へのお礼

ご回答有難うございます。
毎回同じようなことばっかりで申し訳ありません。

ファイル名の変更はできました。
この場合はcgi内の記述にもそれぞれ.を加えるということでいいのですね。
でないとアクセス自体ができません。

<Files ~ "^\..*">

を追記するについては同じくアクセスができなくなってしまうのでいまのところ実行しておりません。
(指定IP以外のアクセスを許可しない記述があるためでしょうか。各キャリア機種別IPと自分のPCのIPです。)

あと「直リンク禁止」などのサイトを見たりして勉強したのですが、どうしても600でのcgi読み込みができません。なぜでしょうか。
そのため、いまはcgi755 html644(tppb) shtml644(topa)にしてあります。
サーバーは確かにSuexecに対応しています。

お礼日時:2008/05/28 06:44

前の回答や他の選択肢とごっちゃになっているのでは?


もういちど整理して書き直します。
#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で読み込む方法を取っています
    • good
    • 0
この回答へのお礼

umasikajiro様

有難うございます!!
今回のお返事で全て解決いたしました。
パーミッションは700と600で稼動しますし、アクセスしたときにtopa.shtmlなど表示されなくなりました。
感動です!!
htaccess内にAddHandler cgi-script .cgi .plの記述もいらないみたいです。

本当に有難うございました。
今回の件でいろいろなサイトや掲示板で質問をいたしましたがここまで親切ご丁寧にしていただいたのは初めてです。
教えていただいたことをしっかり復習し、今後に繋げたいと思います。
有難うございました。

お礼日時:2008/05/28 20:52

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