アクセスログを取るためのcgiをPerlで作っています。
例えば、
hogehoge.html というページのアクセスログを取るためにlog.cgiというスクリプトを用意します。
hogehoge.htmlからは、IMGタグを使用して、<IMG src="log.cgi">のようにcgiを呼び出しています。
log.cgiからは、ダミーのgifファイルを返します。
ここで、log.cgiでは訪問者のリファラを取得して記録するようにしていますが、この仕組みだとhogehoge.htmlがリファラとして記録されてしまいます。(hogehoge.htmlが呼び出したのだから、当然ですね)
hogehoge.htmlへアクセスしたブラウザが持ってたリファラを取得するには、どのようにすればよいでしょうか?
今回はIMGタグでcgiを呼び出していますが、特に手段は選びません。
ちなみに、使用しているサーバーではSSIは使えません。
No.1
- 回答日時:
<SCRIPT language="JavaScript">
<!--
document.write("<img src='log.cgi?ref="+document.referrer+"'>");
// -->
</SCRIPT>
これで取得できると思います。
回答ありがとうございます。
リファラを取得することができましたが、これだとJavaScriptを使用しない設定の人からのアクセスには対応できません。他によい方法がありましたらお願いします。
余談ですが、JavaScriptの場合は、綴りがrefererではなくreferrerなんですね。
No.2
- 回答日時:
> これだとJavaScriptを使用しない設定の人からのアクセスには対応できません
ANo.1の方の方法は、とても一般的な方法だと思いますよ。
つまり、一般的に、JavaScriptオフのためロギングされないのは、誤差の範疇と捉えられます。
少しでも誤差を少なくしたいなら、やはりSSIが理想ですが、仮にSSIが使えたとしても誤差はゼロにはなりません。
これはもうインターネットの仕組み上どうしようもないと言えるでしょう。
どうしても、SSIもJavaScriptも使わずに誤差を少なくしたいなら、たとえばですが、「hogehoge.html」というファイル名のスクリプト(中身はHTMLではなく実はスクリプト。実行ファイルとしての設定をしておく)を作り、アクセスされたらリファラを付けて log.cgi をコールしてから、本来の「hogehoge.html」のHTMLデータを(ファイルから読み取るなどして)そのまま出力、という方法も可能だと思います。
あるいはhtaccess の Action を使って、
Action text/html /~log.cgi
としておき、HTMLへのアクセスがあればlog.cgiが呼び出されるように設定しておく、など。
回答ありがとうございます。
「誤差の範疇」と言われて、ちょっと安心しました。
携帯電話やPDAなどからのアクセスを記録できないなと思い心配していましたが、<NOSCRIPT>でJavaScript非対応からのアクセスもリファラ無しで記録できるので、よしとします。
今回は、プライベートなサイトなので、個人契約しているプロバイダのサーバーを使用します。そのプロバイダでは、.htaccessが使用できないので、ちょっと自由に設定変更はできそうにありません。
.htaccessのActionってのは知らなかったです。勉強になります。ありがとうございました。
No.3
- 回答日時:
#1さんの方法を使う場合、?~&~が付いているURLだった場合を考慮して
document.write("<img src='log.cgi?ref="+escape(document.referrer)+"'>");
としておいたほうがいいかも。
refererが hoge.cgi?aaa=bbb&ccc=ddd だった場合・・
escapeなし
<img src="log.cgi?ref=hoge.cgi?aaa=bbb&ccc=ddd">
escapeあり
<img src="log.cgi?ref=hoge.cgi%3Faaa%3Dbbb%26ccc%3Dddd">
となります。(urlエスケープされる)
なるほど、"&"が複数になった場合、2つ目の"&"以降が無くなってしまうのですね。
検索エンジンからの来訪の場合に、どんなキーワードの検索結果だったのかが分からなくなるということですね。
勉強になります。ありがとうございます。
No.4
- 回答日時:
#3補足。
とりあえず&記号による誤作動を防止するためにescapeを紹介しましたが
実行結果(エンコード方式)が異なるブラウザもあるので
検索エンジンから来た場合のキーワード(日本語)を調べるような場合には注意が必要です。→参考URL
参考URL:http://www.openspc2.org/JavaScript/escape/index. …
重ね重ね、ありがとうございます。
結構、難しいものですね。refereが検索エンジンの検索結果URLだった場合、そのURL自体がすでにエンコードされているので、それをさらにエンコードするのはどうか、ということに気づきました。
で、encodeを使用するもともとの発想は、#4==#3さんが言われるようにrefereに&が入っていた場合の誤動作を防ぐということなので、refereに&が入ってきた場合に大文字の&に変換してからlog.cgiに引き渡すという方法で逃げようと思います。で、log.cgiでは、大文字&を小文字&に戻すと。
慣れないJavaScriptで、こんな感じで作ってみました。
<SCRIPT language="JavaScript">
<!--
REF = document.referrer;
REF = REF.split("&");
REF = REF.join("&");
document.write("<img src='log.cgi?ref="+REF+"'>");
// -->
</SCRIPT>
<NOSCRIPT>
<IMG src="./log.cgi">
</NOSCRIPT>
No.5ベストアンサー
- 回答日時:
cgiでの誤動作を防ぐために全角文字をurlに入れたのでは逆行ですよ(cgi実行以前のところで誤動作する可能性がある)。
「&」は大文字ではなく全角2バイト文字です。
私が参考にしたアクセス解析(http://www.futomi.com/)では、queryから取得して&で分解したデータをもう一度繋ぎ直してますね。
他のデータは必要なくてqueryにはreferrer文字列しか入れないことにすれば、以下のようにシンプルになりますが。(参考 http://www.kent-web.com/)
-- javascript 記述 --
document.write("<img src='log.cgi?"+document.referrer+"'>");
-- perl 記述 --
$ref = $ENV{'QUERY_STRING'};
参考URL:http://www.futomi.com/ http://www.kent-web.com/
失礼しました。encodeする意味を完全に見失ってました。URLにDBCSが混ざったら駄目ですよね。
今までGET/POSTデータの読み取りはライブラリに任せていたのですが、自分で&でsplitすればよいのですね。ありがとうございます。
No.6
- 回答日時:
「&」を全角の「&」にしてしまってはいけない、というのはANo.5の方のおっしゃるとおりですが(そもそも許されるURL形式ではない)、escapeの使用も注意が必要です。
その前に、まずそもそも、「&」だけにこだわっておられるようですが、URLエンコーディングのルールとして、特殊文字はすべて「%XX」という形式にしなければいけません。2バイト文字はもちろん、「&=%+」やスペース文字もです。
正しくエンコーディングされていないと、受け取る側のスクリプトで正しく解釈できないだけでなく、まずURLとして許されないのでスクリプト以前にちゃんと送られるかどうかも保証されません。
そこでescapeを使ってエンコードするわけですが、ANo.4の方がおっしゃっているように、最近のブラウザは一度UNICODEに変換してからURLエンコードするものがあるので、期待通りのデータにならない場合があります。
受け取る側のスクリプトでUNICODEに対応しておくのが最善策ですが、Jcodeモジュールなどが使えない場合は面倒になります(新しいperlなら標準)。
ブラウザを判定して、たとえばIE5以上だったら encodeURI や encodeURIComponent が使える、などという手もあります。
とは言え、そもそもやろうとしているのがアクセス解析なのですから、エンコードデータから検索キーワードを調べたりもすると思われ、各文字コードに対応しているのかもしれませんね。
>ブラウザを判定して、たとえばIE5以上だったら encodeURI や encodeURIComponent が使える、などという手もあります。
これだと、将来新しいブラウザが出た場合に、JavaScriptを修正する必要がありますね。今回は、プライベートなサイトなので、そこまで保守に労力をかけたくないので、#5さんの方法にしようと思います。
すみません。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- CGI CGIで出力するhtmlの<!DOCTYPE html>等のタグは要りますか? 2 2023/02/05 21:26
- CGI サイト訪問者の情報を取得したい 1 2023/02/21 11:03
- CGI htmlからcgiを自動的に起動させたい 1 2023/02/21 19:39
- ホームページ作成・プログラミング CGIが実行可能なHP領域又はレンタルサーバーでおすすめの所を教えてください 現在ホームページ領域の 1 2023/01/01 11:47
- CGI CGIが読み書きするデータファイルのパーミッションはさくらのインターネットでは何にするべき? 1 2023/05/02 16:44
- CGI (フリーの)ツリー掲示版CGI、昔は多用させてもらいましたが・・今セキュリティ上どうでしょう? 2 2023/06/25 07:18
- Perl perlの構文でカンマの意味が分からない 2 2022/10/30 01:53
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- その他(ブログ) ランキングサイトのポイントが発生しない理由 1 2023/01/21 11:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
cgi内から別のcgiを呼び出す。
-
EXCELファイルに誰がアクセスし...
-
URLに~/cgi-bin/~を隠す方法
-
《エクセルVBA》「他の人が該当...
-
CGIを覗かれないように
-
歌詞画ってどうやって作るの?
-
カタカナを英語やフランス語に...
-
自前のアップローダの作り方
-
CGIの予約状況システムについて
-
サイトからCGIをダウンロー...
-
CGI設定の初歩的な質問
-
分かりません。誰か教えて
-
WEB PATIOが表示されない
-
IE5.0でアプリケーションエラー
-
属性値を変えられないのはなぜ...
-
ウェブサイトのカウンター
-
TSVデータを上書きしたい
-
perlからJavascriptを起動
-
エラーで困っています。
-
サーバーを使わずにショッピン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
NAMAZUでの文字化け
-
SSIの『#exec cmd』と『#exe...
-
safariでcgiが表示されず cgi...
-
cgi内から別のcgiを呼び出す。
-
KENT WEBのページカウンタのタ...
-
cgi→csvが文字化け
-
SSIでリダイレクトできないでし...
-
EXCELファイルに誰がアクセスし...
-
《エクセルVBA》「他の人が該当...
-
SFTPなどは使わないホームペー...
-
VBAでサーバーにアクセスするに...
-
URLに~/cgi-bin/~を隠す方法
-
ラジオボタンのグループ化
-
ASPから既存のexcelブックを開...
-
CGIでソースがそのままでてしま...
-
ApacheでのCGIについての質問
-
FTPにて553エラー
-
perl 矢印演算子 -> の使い方
-
ユーザの所属するグループを取...
-
ASP(IIS?)のエラーについて
おすすめ情報