.htaccess 使用mod_rewrite保存HTTP_REFERER?

.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'].'"'); ?> 您当前的解决方案不

实际上,我正试图在.htaccess中传递引用。我试图做的是将referer值发送到一个PHP脚本,在该脚本中,该值将保存到数据库中。在某些情况下(取决于参考者),图像应被阻止(热链接),在其他一些情况下,图像应正常显示。但它不起作用:-(我当前的“尝试”如下所示(它只是用于测试,因此当前将处理每个图像):

referer.php如下所示:

<?
 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]