0

実際には、.htaccess 内でリファラーを渡そうとしています。私がやろうとしているのは、この値がデータベースに保存される PHP スクリプトにリファラー値を送信することです。場合によっては (リファラーに応じて) 画像がブロックされ (ホットリンク)、画像が正常に表示される場合もあります。しかし、それは機能しません:-(私の現在の「試行」は次のようになります(テスト用であるため、現在すべての画像が処理されます):

RewriteCond %{REQUEST_URI} (.*)jpg$
RewriteCond %{ENV:verified}  ^$  
RewriteRule (.*)jpg$   /include/referrer.php?ref=%{REQUEST_FILENAME}&uri=%{REQUEST_URI}&query=%{QUERY_STRING}&env=%{ENV:verified} [E=verified:yes]

RewriteCond %{REQUEST_URI} (.*)jpg$
RewriteCond %{ENV:verified} ^yes$
RewriteRule ^(.*)$    %{REQUEST_FILENAME} [E=verified:no]

referrer.php は次のようになります。

<?
 log_img($_REQUEST['uri'].' - "'.$_REQUEST['env'].'"');
?>

問題は、referrer.php が呼び出されるのに画像が表示されないことです。これは、2 番目のルールに達していないため明らかです。

また、次のように、referrer.php 内に画像を表示しようとしました。

<?
 log_img($_REQUEST['uri'].' - "'.$_REQUEST['env'].'"');
 $src = str_replace($_SERVER['DOCUMENT_ROOT'],'',$_REQUEST['ref']);
?>
<img src="<? echo $src ?>" />

しかし、その後 .htaccess が再度呼び出され、無限ループに陥ります。

問題は、2 番目のルールにアクセスするにはどうすればよいか、またはやりたいことをどのように達成できるかということです。それを行う方法はありますか?

助けてくれてありがとう、ラース

4

1 に答える 1

0

単一の宛先へのリクエストを書き換えるためにしか使用できないため、現在のソリューションは機能しませんmod_rewriteが、リクエストを PHP スクリプトに迂回させてから画像に進むように思われます。PHPスクリプトをトリガーするサブリクエストを発生させることは可能かもしれませんが、そのシナリオで元のリクエストが画像に続くかどうかを制御することはできないと思います.

ここでの最善の方法は、意図したチェック/ロギングを行った後、PHP ファイルに実際の画像データ (画像を参照する画像タグではない) を出力させることです。readfile()正しいヘッダーを送信すれば、これを で行うことができます。ファイルが提供したい画像の 1 つであることを確認した後 (システム上の任意のファイルではないことを確認した後)、少なくとも適切な content type を決定し、データを出力する必要があります。キャッシング(この回答とこの回答を参照を考慮することもお勧めします。

前述の手法のいくつかを組み合わせた、リファラー スクリプトの簡単な疑似例は次のようになります。説明されている手法を実装する最善の方法を調査する必要があることに注意してください。また、ファイルを開いてその内容を印刷するため、セキュリティに特に注意を払う必要があります。

$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]
于 2010-09-21T07:46:11.450 に答える