web-dev-qa-db-ja.com

複数のディレクトリツリーでnginx try_filesを使用する

Nginxが特定のディレクトリへのリクエストを処理するようにして、そのパス/ファイルが複数の個別のディレクトリに存在するかどうかを確認します。たとえば、私のディレクトリルートに次のものがあったとします。

_images/siteA/foo.jpg
images/siteB/b/bar.jpg
images/siteC/example.jpg
_

_http://example.com/images/foo.jpg_でファイルを返す_foo.jpg_、_http://example.com/b/bar.jpg_でファイルを返す_bar.jpg_などを4番目に希望します。

私は次のことを試しましたが、リダイレクトループでロックされるだけです(リダイレクトしないで、実際にそのURLにファイルを提供します)。

_  location /images/ {
    try_files /siteA/images/
              /siteB/images/
              /siteC/images/ =404;

  } 
_

また、location ~/images/(.*)/などのキャプチャグループを使用して、URLの末尾に_$1_を追加してみました。ドキュメントについて少し混乱していて、nginxでこれを実現する方法がわかりません。

4
djsumdog

正規表現locationを使用して、/images/に続くURIの部分をキャプチャする必要があります。次に、try_filesを使用して、各サイトプレフィックスを使用する一連のURIをテストします。

例えば:

location ~ ^/images/(.*)$ {
    root /path/to/docroot/images;
    try_files /siteA/$1 /siteB/$1 /siteC/$1 =404;
}

rootの値を周囲のブロックから継承できます。その場合、パラメーターをtry_filesに適切に調整します。

4
Richard Smith

受け入れられた回答の代わりに、 named location@my_path例)他の場所にフォールバックするには、例えば:

location / {
    root /etc/nginx/static;
    try_files $uri @index;
}

location @index {
    root /srv/http;
    try_files $uri $uri.html /index.html =404;
}
2
max-lt