.htaccess 使用mod_rewrite保存HTTP_REFERER?
实际上,我正试图在.htaccess中传递引用。我试图做的是将referer值发送到一个PHP脚本,在该脚本中,该值将保存到数据库中。在某些情况下(取决于参考者),图像应被阻止(热链接),在其他一些情况下,图像应正常显示。但它不起作用:-(我当前的“尝试”如下所示(它只是用于测试,因此当前将处理每个图像): referer.php如下所示:.htaccess 使用mod_rewrite保存HTTP_REFERER?,.htaccess,rewrite,mod-rewrite,referrer,http-referer,.htaccess,Rewrite,Mod Rewrite,Referrer,Http Referer,实际上,我正试图在.htaccess中传递引用。我试图做的是将referer值发送到一个PHP脚本,在该脚本中,该值将保存到数据库中。在某些情况下(取决于参考者),图像应被阻止(热链接),在其他一些情况下,图像应正常显示。但它不起作用:-(我当前的“尝试”如下所示(它只是用于测试,因此当前将处理每个图像): referer.php如下所示: <? log_img($_REQUEST['uri'].' - "'.$_REQUEST['env'].'"'); ?> 您当前的解决方案不
<?
log_img($_REQUEST['uri'].' - "'.$_REQUEST['env'].'"');
?>
您当前的解决方案不起作用,因为mod_rewrite
只能用于将请求重写到单个目标,但您似乎希望请求绕道PHP脚本,然后继续前进到映像。可能会导致子请求触发PHP脚本,但我不这么认为“我不认为在这种情况下可以控制原始请求是否继续发送到图像
这里最好的做法是,在PHP文件执行您希望它执行的任何检查/记录之后,让它打印出实际的图像数据(而不是引用图像的图像标记)。如果您发送了正确的标题,您可以使用它来执行此操作。在确保该文件是您要提供的图像之一之后(而不是系统上的任意文件…),您至少需要打印数据。考虑缓存也是一个好主意
结合前面提到的一些技术,referer脚本的一个简单的伪示例如下。请注意,您应该研究实现所述技术的最佳方法,并且您需要特别注意安全性,因为您正在打开文件并打印其内容
$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();
<?
log_img($_REQUEST['uri'].' - "'.$_REQUEST['env'].'"');
$src = str_replace($_SERVER['DOCUMENT_ROOT'],'',$_REQUEST['ref']);
?>
<img src="<? echo $src ?>" />
$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();
RewriteEngine on
RewriteRule \.(jpg|png|gif)$ /include/referrer.php [NC]