ホームページ >バックエンド開発 >PHPチュートリアル >NGINX の X-Accel-Redirect 応答について

NGINX の X-Accel-Redirect 応答について

WBOY
WBOYオリジナル
2016-06-23 14:38:541440ブラウズ

インターネットでいくつかの記事を読みましたが、どの記事もファイルのダウンロードの許可を制御するために使用できると書かれていました。
原則として、download.php にアクセスする際に権限を確認します。 渡された場合は、header("X-Accel-Redirect: target file") が使用されます。

しかし、質問があります。ターゲット ファイルの実際のファイル名とストレージ パスがわかっていて、それに直接アクセスした場合、X-Accel-Redirect をバイパスしたことになるのではないでしょうか?

例:
ターゲット ファイルが実際に http://www.1.com/download/123.xls に保存されており、Web サイト ページ http://www.1.com にダウンロード リンクがあると仮定します。 /download.php ?file=xxxx
次に、このリンクを通じて権限制御を行うことができますが、 http://www.1.com/download/123.xls と直接入力してアクセスするとどうなるでしょうか?許可制御を回避していませんか?


ディスカッションへの返信(解決策)

Web アプリケーションでは、ダウンロードが必要なファイルがよくあります。これらのファイルが非常にプライベートであり、Web サーバーから直接ダウンロードされる場合、ファイルのダウンロード許可をチェックすることはできません。以前は、このような権限が必要な状況に遭遇した場合、プログラミング言語を使用してファイルを読み取り、権限を決定した後に出力することで権限の問題を解決していました。ただし、ファイルの読み取りにプログラミング言語を使用すると、ファイル サイズが大きい場合や同時ダウンロード数が多い場合、すぐにサーバーが過負荷になってしまいます。


この状況に基づいて、Web サーバー ソフトウェアは対応するソリューションを提供します。つまり、応答ヘッダーを使用してダウンロードを制御します。現在、squid、apache、lighttpd、nginx、およびその他の http サーバーはすべてこのメソッドをサポートしていますが、応答ヘッダー名はすべて異なります:

nginx: X-Accel-Redirect
suck: X-Accelerator-Vary
apache: X -Sendfile
lighttpd: 、Web サーバーはファイルをすぐにクライアントに出力するのではなく、リクエストをバックエンド プログラミング言語に渡します。プログラミング言語は、クライアントがファイルをダウンロードして、対応する X を書き込むことができるかどうかを確認します。 -Accel-Redirect ヘッダーを返し、処理を終了します。X-Accel-Redirect ヘッダーが返されると、Web サーバーはこのヘッダーを確認した後、ファイルをクライアントに出力します。

それでは、クライアントが X-Accel-Redirect ヘッダーを偽造して読み取る場合はどうなるでしょうか?もちろん、Web サーバーはバックエンドから送信された X-Accel-Redirect ヘッダーのみを認識し、クライアントから送信されたヘッダーは認識しないため、ダウンロードすることはできません。

そこで、nginx を使用して上記のプロセスを実装しましょう:

1. クライアントがリクエストを開始すると、このディレクトリに対するすべてのリクエストがバックエンドに渡されます

location /mp3/ {
alias / data/ html/mp3/;
error_page 403 =200 @backend;

location @backend {
proxy_pass http://www.sudone.com }

このようにして、ユーザーは http://www.sudone.com にアクセスします。 ://www .sudone.com/mp3/1.mp3 などのアドレスを使用すると、ファイルはダウンロードされず、nginx はリクエストをバックエンド サーバーに渡します。

2. バックエンドサーバーでリライトを設定します

rewrite "^/mp3/(.*).mp3$" /read_file.php?id=$1 last;

このリライトの目的は http:/ をリクエストすることです。 / www.sudone.com/mp3/1.mp3 は PHP プログラミング言語を指しており、プログラミング言語によって処理されます。

3. 権限を決定するための php プログラムを作成します

制限時間内 (19:00 から 23:00) にファイルをダウンロードできる場合:
$hour=getdate()[hours];
if ($hour>= 19 && $hour< =23)
{
header("Content-Type: application/octet-stream")
header("X-Accel-Redirect: /mp3/".$id.".mp3" );
}
?> ;

このアドレスに毎晩19:00から23:00までアクセスすると、X-Accel-Redirectヘッダーが出力され、その内容がファイルアドレスになります。ファイルは、X-Accel-Redirect ヘッダーが出力された後にのみダウンロードできます。それ以外の場合、クライアントは何も取得しません。したがって、ファイルをダウンロードできるのは夕方の19:00から23:00までであり、それ以外の時間帯はダウンロードできません。

以上で設定は完了です。

私も自分で設定しようとしましたが、PHP はリクエストを再転送しましたが、サーバーは最後のステップで常に 404 エラーを報告しました。その理由はわかりませんでした。バージョンと関係があるのか​​わかりませんが、インストールしたnginxのバージョン情報が私によって変更されたため、バージョン番号が見つかりません。

1階は親切ではありません。投稿された記事を何度か読んだのですが、Apacheに詳しくないのでよく理解できませんでした。 。
下の階の専門家が答えてくれるといいですね

Discuz x2 はこの機能をサポートしています
いつかテストします。

1階は親切ではありません。投稿された記事を何度も読んだのですが、Apacheに詳しくないのでよく理解できませんでした。
下の階の専門家が答えてくれることを願っています

この場合、ダウンロードしたいファイルは Web ルート ディレクトリの外に配置する必要があります。つまり、http で直接アクセスすることはできません。
たとえば、http://www.123.com/ はディレクトリ /home/httpd/html を指します。サーバー上のダウンロードされたファイル 123.exe の実際のパスは、/home/soft/123.exe である可能性があります。 nginxなどのサーバーソフトウェアにはアクセスできますが、Webユーザーはhttpメソッドでアクセスできません

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。