私は、特定のPHPサイトへのRewriteRule経由ホットリンカーをリダイレクトし、処理し、IPアドレス($ _SERVER [ 'REMOTE_ADDR'])、リファラ($ _SERVER [ 'HTTP_REFERER'])のようなデータを保存しますユーザエージェント($ _SERVER ['HTTP_USER_AGENT'])を呼び出し、データベース(例えば、MySQL)のタイムスタンプまたは単一のファイルにアクセスします。
しかし、多くのデータベース/ファイル書き込み(ホットリンクが多数ある場合)を使用してサーバーを過負荷にしないように注意する必要があります。
私のソリューションは以下の通りテストしました。
.htaccess
ファイル:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain.com/.*$ [NC]
RewriteRule .*\.(jpe?g|gif|bmp|png)$ log_hotlinkers.php [L]
log_hotlinkers.php
ファイル:MySQLで
<?php
// I use PDO with a wrapper class
require_once($_SERVER['DOCUMENT_ROOT'].'/PHP/classes/class.DB.php');
$session_return_value = session_start();
// is is already stored (per session)?
$is_stored = (bool)!empty($_SESSION['user_visit_stored']);
// we store this hotlinker only once per session
if(!$is_stored){
// IP address
$IP_address = $_SERVER['REMOTE_ADDR'];
// user agent variable is not always set, in this case we set variable to "unknown"
$HTTP_USER_AGENT = !empty($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'unknown';
// session id
$session_id = session_id();
// the $_SERVER['HTTP_REFERER'] variable is not always set (in this case we will store it with a NULL value)
$HTTP_REFERER = !empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : 'NULL';
// we store hotlinker's data in MySQL database (e.g. in a table called hotlinkers with an auto_increment id with the following fields)
$query = 'INSERT INTO hotlinkers (IP_address, user_agent, session_id, HTTP_REFERER) ';
$query .= ' VALUES (:REMOTE_ADDR, :HTTP_USER_AGENT, :session_id, :HTTP_REFERER) ;';
// I use PDO with a wrapper class
$stmt = DB::getDB()->prepare($query);
$stmt->bindParam(':REMOTE_ADDR', $IP_address); // IP address
$stmt->bindParam(':HTTP_USER_AGENT', $HTTP_USER_AGENT); // user agent
$stmt->bindParam(':session_id', $session_id); // session_id()
$stmt->bindParam(':HTTP_REFERER', $HTTP_REFERER); // referer
$exec_result = $stmt->execute();
if($exec_result){
// we store that agent is beállítjuk a megfelelő session-változót: a látogató eltárolva
$_SESSION['user_visit_stored'] = true;
$_SESSION['user_visit_time'] = time();
}
else{
// throw new PDOException('Couldn\'t store hotlinker\'s data...');
}
}
// we output another image which signs blocking
$path = './block-hotlinking-image.png';
$im = imagecreatefrompng($path);
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
?>
、私のhotlinker
テーブルの構造は以下の通りです:
CREATE TABLE `hotlinkers` (
`id` int(11) not null auto_increment,
`IP_address` varchar(40) not null default '0.0.0.0',
`visit_timestamp` timestamp not null default CURRENT_TIMESTAMP,
`user_agent` text not null,
`session_id` char(32) not null,
`HTTP_REFERER` varchar(255),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
テストホットリンクここにHotlink checkerがあります。
これは役に立ちましたと思います。
既に書いてある書き換えルールを共有するので、これを行う方法を提案できます。 – Shef