解析したいページ(index.html)の<body>~</body>の間に<img src="acclog.php">としてアクセス取得用ファイルを追記しているのですが、取得されるURLがindex.htmlではなく、acclog.phpになります。
acclog.phpには以下のようしています(URL取得箇所だけ抜粋)
$uri = getenv('REQUEST_URI');
header("Content-Type: image/jpeg");
どのようにすれば解析ページのURLを取得できるのでしょうか?
試しに、手元のPCにapacheとphpをインストールしたら、次の方法でうまくいきました。
index.html:
<html><body><h1>アクセスログテスト</h1><img src="acclog.php"></body></html>
acclog.php:
<?
$url = $_SERVER["HTTP_REFERER"];
$filepointer=fopen("./access.log", "a+");
fputs($filepointer, $url . "\r\n");
fclose($filepointer);
header("Content-Type: image/jpeg");
?>
ブラウザでhttp://localhost/index.htmlにアクセスすると、access.logファイルに「http://localhost/index.html」が記録されました。これはお望みの動作でしょうか。
PHPだけで img タグの呼び出し元をチェックするのは難しいと思います。
SSIが利用できる環境であれば、
<img src="acclog.php?url=<!--#echo var="DOCUMENT_URI" -->">
としてはどうでしょう。
>PHPだけで img タグの呼び出し元をチェックするのは難しいと思います。
PHPやCGIのアクセス解析が多く存在するので、出来るはず・・・だと思っているのですが、無理なのでしょうか。
ちなみにSSIが利用できる環境ではないので、上記の方法は無理です。SSIを使わない方法でお願いします。
phpは使ったことがないのですが、acclog.phpで
$url = $_SERVER[”HTTP_REFERER”];
と書けばログを取得できそうです。
それはリファラ(リンク元)のことではありませんか?
試しにやってみましたが、$uriには
acclog.php?referrer=
となるだけです。
まずなぜそのような結果になっているかですが、
環境変数「REQUEST_URI」は今現在実行されているファイル(PHP)のURIを
表す物です。そして、ブラウザからサーバへのリクエストは、index.htmlと画像(img要素)は別々に行われます。
上記の理由から、PHP上でREQUEST_URIを参照した場合は自分自身のURIが返ってくるという動作で正常です。
img要素を利用されたいなら、pahooさんの方法を利用されるか、何らかの方法でクエリーURLを付加してあげる方法をとるしかないでしょう。
※自分でページ毎につける、JavaScriptを利用するなど
最近のアクセス解析はJavaScriptでとれるだけの情報を取得して、サーバに投げる形式が多いのでそれを踏襲される方が良いかなと、個人的には思います。
Google Analyticsや、商用利用が中心のタグ埋め込み式のアクセス解析は大抵この形です。
http://www.google.com/analytics/ja-JP/
#結局noscript要素でimg要素を指定しますけどね。
<script type="text/javascript">document.write("<img src='acclog.php?");document.write("url="+document.URL+"'>");</script> |
と言う方法でURLは取得出来、acclog.phpから参照する事は出来るのですが、
noscriptの場合は困ってしまいますね。
Google Analytics規模ではなくもっと小規模の、個人の方がフリーで配布している物を想定しています。はてなで答えが得られると思って質問しましたが、難しいようであれば他者のプログラムを解析してみます。
試しに、手元のPCにapacheとphpをインストールしたら、次の方法でうまくいきました。
index.html:
<html><body><h1>アクセスログテスト</h1><img src="acclog.php"></body></html>
acclog.php:
<?
$url = $_SERVER["HTTP_REFERER"];
$filepointer=fopen("./access.log", "a+");
fputs($filepointer, $url . "\r\n");
fclose($filepointer);
header("Content-Type: image/jpeg");
?>
ブラウザでhttp://localhost/index.htmlにアクセスすると、access.logファイルに「http://localhost/index.html」が記録されました。これはお望みの動作でしょうか。
全く同じソースをコピーしてファイルを用意しましたが、希望通りできていますね・・。
私のテストしたファイルが悪かったのか、何が原因なのかいまいち掴めませんが、、希望通りに出来ましたので、質問を終了させていただきます。
この質問の為にインストールまでしていただき、大変感謝しております。ありがとうございました。
全く同じソースをコピーしてファイルを用意しましたが、希望通りできていますね・・。
私のテストしたファイルが悪かったのか、何が原因なのかいまいち掴めませんが、、希望通りに出来ましたので、質問を終了させていただきます。
この質問の為にインストールまでしていただき、大変感謝しております。ありがとうございました。