現在、携帯向け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件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
前の回答や他の選択肢とごっちゃになっているのでは?
もういちど整理して書き直します。
#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様
有難うございます!!
今回のお返事で全て解決いたしました。
パーミッションは700と600で稼動しますし、アクセスしたときにtopa.shtmlなど表示されなくなりました。
感動です!!
htaccess内にAddHandler cgi-script .cgi .plの記述もいらないみたいです。
本当に有難うございました。
今回の件でいろいろなサイトや掲示板で質問をいたしましたがここまで親切ご丁寧にしていただいたのは初めてです。
教えていただいたことをしっかり復習し、今後に繋げたいと思います。
有難うございました。
No.6
- 回答日時:
>・ 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に対応しています。
No.5
- 回答日時:
*選択肢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とはどこを指すのでしょうか。
これが成功すればもうお手を煩わすことはないと思います。
宜しくお願い申し上げます。
追伸
広告の件、テストまでしていただき、大変助かりました。
心より感謝申し上げます。
ご報告
このたびは大変お騒がせいたしました。
ご助力頂きました結果、当初の目的としておりました作業が無事終わりました。
有難うございます。
結果的には選択肢2を使用し、現在稼動しております。
これからの課題として
・ topa.html の頭に . を付け .topa.html 等とする
(ファイル名を付けろとエラーになります。)
・または Suexecを使っているサーバーなら topa.html のパーミッションを 600 などにする
(サーバーはSuexecを使用しているのですが600にするとhtmlが表示されなくなります。)
ひとつ心配なのが、サーバーでアクセスログ内のリファラーを確認したのですが/topa.shtmlと記載がありました。
上記2つのうち、どちらかを実行すれば解消されるものと奮起しております。
しつこいようですが、心より感謝いたします。
有難うございました。
No.4
- 回答日時:
う~んん説明の仕方が悪かったかな
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の情報は行くのでしょうか。
行くのであれば注意を受ける前に何らかの変更をしなければと思いまして。
すみません。
甘えていろいろ聞いちゃいました。
No.3
- 回答日時:
.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にするというのが最大の目的であります。
お力添え頂けましたら幸いです。
宜しくお願い申し上げます。
No.1
- 回答日時:
ブラウザで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によって振分けられるはずなんです。
すみません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
cgiもしくはJAVAなのでしょうか...
-
第1のPC(192.168.0.1)の/var/ww...
-
YY-BOARDについて
-
EXCELファイルに誰がアクセスし...
-
《エクセルVBA》「他の人が該当...
-
FTPにて553エラー
-
HTTP 501未実装 エラーについて
-
SSI(<!--#exec cmd="./XXXpl")...
-
CGIエラー、どうしたらいいか・...
-
ASPからJavaScriptへの受け渡し...
-
tplファイルのプレビューの方法
-
PyCharmでのCGIを使ったWebサー...
-
perlからphpを実行して結果を得...
-
ラジオボタンのグループ化
-
CGIでソースがそのままでてしま...
-
FFFTPでアップロードできない?
-
VBScriptで、ファイルから任意...
-
2ちゃんねるの書き込みで
-
HTML字数制限対応の文字置換 パ...
-
一つのファイルだけにPremature...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
htmlにアクセスと同時に、あるC...
-
CGIでコードがむきだしの状態で...
-
メールフォームのCGIでデータが...
-
フォームの情報が送信されるよ...
-
public_html外でCGIやPHPを動か...
-
携帯とPCの振り分け
-
自社サーバー異常発生。CGIがポ...
-
IISのSSIの設定について
-
Forbiddenの意味
-
サイト内のファイルの更新日を...
-
http://tydsu.com/oeder と後ろ...
-
1-man.netでメールフォームの設...
-
.htaccessを用いて.cgiを.html...
-
YY-BOARDについて
-
utf-8で作成した。formmailのht...
-
花の名前を教えてください。 8...
-
表示画面が真っ白になる場合、...
-
メールフォームの設定なのです...
-
private_htmlについて
-
第1のPC(192.168.0.1)の/var/ww...
おすすめ情報