nginx を使用してサーバー上の画像のフォルダ構造を非表示にする

nginx を使用してサーバー上の画像のフォルダ構造を非表示にする

私のサーバーには次のフォルダー階層があります。
/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

見るこのドキュメント詳細については。

関連情報