最終更新日:2015年3月17日 at 12:52 PM
これまでの実験で、WordPressにおけるテーマのheader.phpより、単純にperlのアクセス解析プログラム「perlstats.cgi(仮称)」を呼び出すと、サーバーの環境変数が引き継がれない事が判明しています。
今回は、WordPressのindex.phpのプログラム内にperlのアクセス解析プログラムを呼び出す実験をしました。
なお、普通に呼び出すと、やはり環境変数が渡らないようなので、予め、PHPのプログラム側から環境変数を取得し、パラメーターで渡す方式でperlのプログラムも修正しました。
index.phpのプログラムコードは、以下の通りです。
(セキュリティ上、実際のコードを少し修正しています)
<?php
/**
* Front to the WordPress application. This file doesn't do anything, but loads
* wp-blog-header.php which does and tells WordPress to load the theme.
*
* @package WordPress
*/
/**
* Tells WordPress to load the WordPress theme and output it.
*
* @var bool
*/
define('WP_USE_THEMES', true);
/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/your_wp_directory/wp-blog-header.php' );
?>
<?php
/**
* perlstats.cgi
*/
$pl_host = getenv('REMOTE_HOST');
$pl_addr = getenv('REMOTE_ADDR');
$pl_agent = getenv('HTTP_USER_AGENT');
$pl_ref = getenv('HTTP_REFERER');
echo file_get_contents("https://senris.com/cgi-bin/perlstats/perlstats.cgi?host=$pl_host&addr=$pl_addr&agent=$pl_agent&ref=$pl_ref");
?>
perlstats.plの実行後の結果を表示する管理プログラムの画面を以下に示します。
上の画面を見ると、以下のサーバーの環境変数は、引き渡されている事が分かります。
REMOTE_HOST
REMOTE_ADDR
HTTP_USER_AGENT
しかし、残念ながら、リンク元URLの集計が’0’のままなので、HTTP_REFERERは送られていない模様です。
そこで、そもそも、HTTP_REFERERがPHPならびにperlで正しく設定されているのかどうかを確かめるため、簡単な実験サイトを作って検証して見ました。
まず、使用可能な環境変数を表示するPHPのプログラム「server_key.php」です。(以下)
<?php
/*
サーバー環境変数一覧表示(PHP)
*/
echo "使用可能なサーバー変数一覧(PHP)<br /><br />\n";
foreach($_SERVER as $server_key => $server_val){
echo $server_key."="."$server_val<br />\n";
}
?>
次に、使用可能な環境変数を表示するperlのプログラム「server_key.pl」です。(以下)
#!/usr/bin/perl
# サーバー環境変数一覧表示(perl)
print "Content-Type: text/html\n\n";
print "<html><br />\n";
print " <head><title>サーバー環境変数一覧(perl)</title></head><br />\n";
print " <body><br />\n";
print "環境変数一覧(perl)<br /><br />\n";
foreach (sort keys %ENV)
{
print "$_ = $ENV{$_}<br />\n";
}
print " </body><br />\n";
print "</html><br />\n";
そして、それらのプログラムを呼び出す側のHTMLコード「test_referer.html」です。 (以下)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>HTTP_REFERERのテスト</title>
</head>
<body>
<h1>HTTP_REFERERのテスト<br>
<br>
<a href="https://www.senris.com/test/server_key.pl" target="_blank">ここをクリック(server_key.pl)</a><br>
</a><br>
<a href="https://www.senris.com/test/server_key.php" target="_blank">ここをクリック(server_key.php)</a><br>
</a><br>
<a href="https://www.senris.com" target="_blank">ここをクリック(senris.com)</a><br>
</h1>
</body>
</html>
上の二つのリンクのそれぞれの結果は、以下の通りです。
PHP、perlともサーバー環境変数の取得はちゃんと出来ている事がこれで、分かりました。
WordPress上でなければ、問題なく動くようです。
問題は、三番目のリンク(index.php)です。
結局、HTTP_REFERERは取得できていませんでした。
そこで、index.phpへのコードの挿入位置に問題があるのかもしれないという事で、以下のように変更して見ました。
<?php
/**
* perlstats.cgi
*/
$pl_host = getenv('REMOTE_HOST');
$pl_addr = getenv('REMOTE_ADDR');
$pl_agent = getenv('HTTP_USER_AGENT');
$pl_ref = getenv('HTTP_REFERER');
echo file_get_contents("https://senris.com/cgi-bin/perlstats/perlstats.cgi?host=$pl_host&addr=$pl_addr&agent=$pl_agent&ref=$pl_ref");
/**
* Front to the WordPress application. This file doesn't do anything, but loads
* wp-blog-header.php which does and tells WordPress to load the theme.
*
* @package WordPress
*/
/**
* Tells WordPress to load the WordPress theme and output it.
*
* @var bool
*/
define('WP_USE_THEMES', true);
/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/your_wp_directory/wp-blog-header.php' );
?>
その結果は、見事に失敗でした。 (>_<)
PHPの同一スコープ内に置いても、同じ結果でした。
NewStatPressなど、WordPressのプラグインでHTTP_REFERERの情報が非同期にリセットされているような気がするのですが、詳しい原因は私には良く分かりません。
もしかしたら、プラグイン「WP Super Cache」によるキャッシュが原因かもしれません。
この件で解る方、誰か、エロイ先生教えて下さい!!(笑)
という事で…
WordPressからperlプログラムへHTTP_REFERERを渡すのは難しいので、perlのアクセス解析プログラム「perlstats.cgi」において、「リンク元URLの集計」の部分はできないという事で諦めます。 orz