Ваше текущее решение не работает, потому что mod_rewrite
может использоваться только для перезаписи запроса в один пункт назначения, но вы, похоже, хотите, чтобы запрос отклонился от вашего PHP-скрипта, а затем продолжил работу с изображением. Может быть возможно вызвать подзапрос, который вызовет запуск сценария PHP, но я не думаю, что было бы возможно контролировать, продолжал ли исходный запрос к изображению в этом сценарии.
Лучший способ действий здесь - распечатать PHP-файл с фактическими данными изображения (а не с тегом изображения, ссылающимся на изображение) после того, как он выполнит любую проверку / регистрацию, которую вы намереваетесь сделать. Вы можете сделать это с readfile()
, при условии, что вы отправляете правильные заголовки. Убедившись, что файл является одним из изображений, которые вы хотите отправить (а не какой-либо произвольный файл в вашей системе ...), вам по крайней мере потребуется определить соответствующий тип контента , а затем распечатать из данных. Также неплохо бы учитывать кеширование (см. этот ответ , а также этот ).
Сочетая некоторые из упомянутых приемов, простой псевдо-пример скрипта-реферера будет следующим. Обратите внимание, что вам следует изучить лучший способ реализации описанных методов, и вам необходимо уделять особое внимание безопасности, поскольку вы открываете файлы и распечатываете их содержимое.
$filename = /* sanitized file name */;
log_img(/* log some data about the request */);
if (file_exists($filename) && allowedToView($filename)) {
// Assume we're not on PHP 5.3...
$types = array(
'gif' => 'image/gif',
'png' => 'image/png',
'jpg' => 'image/jpg',
);
$parts = pathinfo($filename);
$ext = strtolower($parts['extension']);
if (array_key_exists($ext, $types)) {
$mime = $types[$ext];
$size = filesize($filename);
$expires = 60 * 60 * 24 * 30;
if (!empty($_SERVER['IF-MODIFIED-SINCE'])) {
$modified = filemtime($filename);
$cached = strtotime($_SERVER['IF-MODIFIED-SINCE']);
if ($modified <= $cached) {
header('HTTP/1.1 304 Not Modified');
exit();
}
}
header("Content-Type: $mime");
header("Content-Length: $size");
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expires)
. ' GMT');
header('Cache-control: private, max-age=' . $expires);
readfile($filename);
exit();
}
}
header("HTTP/1.0 404 Not Found");
exit();
А что касается файла .htaccess, он будет выглядеть примерно так (материал, который вы добавили в строку запроса, в любом случае доступен в $_SERVER
, поэтому я не вижу смысла вручную передавать его в скрипт ):
RewriteEngine on
RewriteRule \.(jpg|png|gif)$ /include/referrer.php [NC]