私のサーバーには次のフォルダー階層があります。
/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
見るこのドキュメント詳細については。