PHPでアクセス解析を作成しています。


解析したいページ(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を取得できるのでしょうか?

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/01/08 02:35:44
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kelly1414213 No.4

回答回数13ベストアンサー獲得回数2

ポイント100pt

試しに、手元の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」が記録されました。これはお望みの動作でしょうか。

id:k27w

全く同じソースをコピーしてファイルを用意しましたが、希望通りできていますね・・。

私のテストしたファイルが悪かったのか、何が原因なのかいまいち掴めませんが、、希望通りに出来ましたので、質問を終了させていただきます。


この質問の為にインストールまでしていただき、大変感謝しております。ありがとうございました。

2009/01/08 02:35:21

その他の回答3件)

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633

ポイント10pt

PHPだけで img タグの呼び出し元をチェックするのは難しいと思います。

SSIが利用できる環境であれば、

<img src="acclog.php?url=<!--#echo var="DOCUMENT_URI" -->">

としてはどうでしょう。

id:k27w

>PHPだけで img タグの呼び出し元をチェックするのは難しいと思います。


PHPやCGIのアクセス解析が多く存在するので、出来るはず・・・だと思っているのですが、無理なのでしょうか。


ちなみにSSIが利用できる環境ではないので、上記の方法は無理です。SSIを使わない方法でお願いします。

2009/01/07 22:56:59
id:kelly1414213 No.2

回答回数13ベストアンサー獲得回数2

id:k27w

それはリファラ(リンク元)のことではありませんか?

試しにやってみましたが、$uriには

acclog.php?referrer=


となるだけです。

2009/01/07 23:18:14
id:munyaX No.3

回答回数120ベストアンサー獲得回数24

ポイント10pt

まずなぜそのような結果になっているかですが、

環境変数「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要素を指定しますけどね。

id:k27w

<script type="text/javascript">document.write("<img src='acclog.php?");document.write("url="+document.URL+"'>");</script>

と言う方法でURLは取得出来、acclog.phpから参照する事は出来るのですが、

noscriptの場合は困ってしまいますね。


Google Analytics規模ではなくもっと小規模の、個人の方がフリーで配布している物を想定しています。はてなで答えが得られると思って質問しましたが、難しいようであれば他者のプログラムを解析してみます。

2009/01/08 02:24:39
id:kelly1414213 No.4

回答回数13ベストアンサー獲得回数2ここでベストアンサー

ポイント100pt

試しに、手元の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」が記録されました。これはお望みの動作でしょうか。

id:k27w

全く同じソースをコピーしてファイルを用意しましたが、希望通りできていますね・・。

私のテストしたファイルが悪かったのか、何が原因なのかいまいち掴めませんが、、希望通りに出来ましたので、質問を終了させていただきます。


この質問の為にインストールまでしていただき、大変感謝しております。ありがとうございました。

2009/01/08 02:35:21
  • id:kelly1414213
    失礼しました、引用先のWebページには、CGIのリファーラーに元ページのURLがセットされるとあったので、index.htmlにアクセスすれば、acclog.phpのリファーラーにindex.htmlがセットされるのではと思ったのですが、うまくいかないようですね。
  • id:pahoo
    老婆心ながら――。
    kelly1414213 さんの方法は「Webビーコン」などと呼ばれており(http://www.pahoo.org/e-soul/privacy/athome/athome-026.shtm)、セキュリティ対策ツールに引っかかったり、SEO的に不利になる場合があります。それを使っていることをサイトに明示した方が良いです。
    また、acclog.phpに直リンされると間違ったカウントがなされてしまいます。acclog.phpの拡張子を偽装したり、直リン禁止の措置をした方が良いです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません