![nginx を使用してサーバー上の画像のフォルダ構造を非表示にする](https://rvso.com/image/726834/nginx%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E4%B8%8A%E3%81%AE%E7%94%BB%E5%83%8F%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E9%80%A0%E3%82%92%E9%9D%9E%E8%A1%A8%E7%A4%BA%E3%81%AB%E3%81%99%E3%82%8B.png)
私のサーバーには次のフォルダー階層があります。
/var/images/d/d8/d82fa6c3eed/image.png
ディレクトリ構造は MD5 ハッシュから作成され、サブフォルダーに分割されます。
Nginxを使ってウェブユーザーに画像を提供したいのですが、ディレクトリ構造を公開したくありません。例えば、ない次のようにファイルを提供したい:
http://domain.tld/d/d8/d82fa6c3eed/image.png
次のようなものを提供したいです:
http://domain.tld/b/4324re3fg34f6td/image.png
私も nginxsecure link
モジュールを使用していますが、次のようにイメージを取得するにはディレクトリを指定する必要があります。
http://domain.tld/b/<secure link MD5 hash>/path/to/file.png
次のように書き換えられます:
http://domain.tld/images/path/to/file.png?md5=<secure link md5>
ファイルを取得するために、ファイル システム上の実際の特定のディレクトリ パスを指定したくありません。私は次のように考えていました。
- クライアントはファイルへのディレクトリ パスを表す何らかの MD5 値を送信でき、NGINX は N 文字ごとに / を挿入します。これは可能ですか?
- base64 でエンコードされたディレクトリ パスを送信し、NGINX でそれをデコードして内部的にリダイレクトします。これはどうですか?
- おそらく、これには openresty モジュールのような追加モジュールを使用するのでしょうか?
これを達成できますか?
私の nginx 設定:
server {
..
root /var/www/html;
..
location /b/ {
rewrite ^/b/([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_\-]+)/(.*)$ /images/$2/$3?md5=$1 last;
}
location /images/ {
internal;
secure_link $arg_md5;
secure_link_md5 '$uri mysecretkey';
if($secure_link = "") { return 404; }
if($secure_link = "0") { return 410; }
}
}
答え1
使用したことがないsecure_link
ので、提案のその部分についてはコメントできません。ただし、書き換えられた URI をブロックrewrite...last
で処理したい場合は、を使用する必要があるという明らかなエラーがあります。サフィックスにより、URI は同じ場所内で処理されます。location /images/
break
見るこのドキュメント詳細については。