-1

以前に議論されたかもしれませんが、迅速でクリーンな解決策が見つかりません。

1) フォルダにたくさんのファイルがあり/data/ます: .jpg、.gif、.mp4、.pdf など。

/data/.htaccess2)各リクエストをキャッチして PHP プロセッサにリダイレクトするファイルを作成したい。

/data/filename.jpg -> /data/processor.php?file=filename.jpg

3) はprocessor.php次のように行います。

3a) 有効な$_SESSION['logged_in'] == TRUE

3b) 対応するヘッダーを送信する

3c) ファイルデータの送信

理想的には、.htaccess リダイレクトによってブラウザの URL が変更されないため、現在のすべてのファイル リクエストは、ログインしている限り有効なままになります。

編集:

提案されたように、より良いアプローチは、ファイルを Web ルートの外に置くことです。/html/data/processor.phpしたがって、すべてのメディア ファイル (.jpg や .mp4 など)のみを残し、 /media/Web ルートの外に移動します。

4

2 に答える 2

3

ブラウザで URL を変更したくない場合は、リダイレクトではなく URL の書き換えが必要です。.htaccess ファイルは次のようになります。

RewriteEngine On
RewriteRule ^data/(.+) /data/processor.php?file=$1 [L]

これにより、ブラウザで URL に対して何もせずに、/data/filename.jpgリクエストが実際にリクエストされます。/data/processor.php?file=filename.jpgその後、processor.php スクリプトがそこから引き継ぐことができます。

サーバーの構成内で mod_rewrite を有効にする必要があることに注意してください。

他に考慮すべきことがあります。セキュリティとユーザビリティのどちらがより重要かによって、これらのファイルをドキュメント ルートの外部に保持する必要がある場合と保持しない場合があります。.htaccess 部分が何らかの理由で失敗した場合、デフォルトでファイルにアクセスできるようにしますか? 言い換えれば、この場合、ユーザーのアクセス権に関する疑念に対して、ユーザーに利益を与えますか? その場合、URL が機能し、ユーザーが期待するファイルを配信するため、ファイルをそのままにしておくのが最善です。アクセスを許可しない側でエラーが発生したい場合は、スクリプトを通過する mod_rewrite ルールなしではアクセスできないように、ファイルをドキュメント ルートの外に移動することをお勧めします。

/data/processor.php

プロセッサがどのように見えるかのサンプルを次に示します。

<?php
// Get MIME Type
    $finfo     = finfo_open( FILEINFO_MIME_TYPE );
    $mime_type = finfo_file( $finfo, $_GET['file'] );
    finfo_close( $finfo );

// Send headers
    header( "Content-Type: $mime_type" );
    header( "Content-Length: " . filesize( $_GET['file'] );

// Send file data
    readfile( $_GET['file'] );
?>

$_GET['file']ファイルの場所に応じて、必要に応じてパスを必ず含めてください。

于 2013-08-09T16:48:20.370 に答える
0

これが私にとってうまくいった完全な解決策です。念のため、誰にとっても役立つかもしれません。ありがとう@Nick Coons!

HTAccess ファイル/html/media/.htaccess

RewriteEngine On

RewriteCond %{REQUEST_URI} \.(png|jpe?g)$ [NC]
RewriteRule ^(.+) index.php?file=$1 [L]

プロセッサ ファイル/html/media/index.php

<?php

require_once '../config/config.php';

// must be logged in
if ( ! @$_SESSION['logged_in']) exit('Access denied. You are not logged in.');

// check if file exists
$file = dirname(dirname(getcwd())) . '/media/' . @$_GET['file'];
if ( ! is_file($file)) exit('404');

// Get MIME Type
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($finfo, $file);
finfo_close($finfo);

// Send headers
header("Content-Type: $mime_type");
header('Content-Length: ' . filesize($file));

// Send file data
readfile($file);

/* End of file */

メディア フォルダ/media/

.png and .jpg files are stored here outside of the web-root

/html/media/bike.pngログインしているユーザーに対してのみ機能するように要求するようになりました。

于 2013-08-12T18:36:14.477 に答える