web-dev-qa-db-ja.com

nginxで常に1つのファイルを返すようにロケーションブロックを構成するにはどうすればよいですか?

私のアプリケーションでは、場所 "/"で静的なindex.htmlファイルを返し、 "/ static"でフォルダーから静的ファイルを提供し、他のすべての要求で404 NOT FOUNDを返します。後で、他のすべての要求をWSGIサーバーにリダイレクトします。

これは現在私の設定です:

# Dev server.
server {
    listen 1337;
    charset UTF-8;

    location / {
        rewrite ^ static/index_debug.html break;
    }

    location /static {
        alias /home/tomas/projects/streamcore/static;
    }
}

静的フォルダーは完全に機能していますが、「/」は404 NOT FOUNDを返します。私も試しました:

alias /home/tomas/projects/streamcore/static/index_debug.html;

ロケーションブロックでは、500の内部サーバーエラーが返されます。 aliasは単一のファイルが好きではないようです。さらに私は試しました:

try_files static/index_debug.html;

ただし、これにより、「try_filesディレクティブの引数の数が無効です」というエラーでサーバーが起動しなくなります。どうやらtry_filesは実際には複数のファイルを試す必要がありますが、これは私が探している動作ではありません。

だから私の質問は:静的ブロックを常に返すようにロケーションブロックを構成するにはどうすればよいですか?


編集:他の回答から、aliasは確かに単一のファイルを引数として受け入れるはずなので、試してみました:

location = / {
    alias /home/tomas/projects/streamcore/static/index_debug.html;
}

しかし、まだ500の内部サーバーエラーしか発生しません。 「/」リクエストのエラーログには次のように記載されています。

[アラート] 28112#0:* 7「/home/tomas/projects/streamcore/static/index_debug.htmlindex.html」はディレクトリではありません

「index_debug.htmlindex.html」を開こうとするのはなぜですか?どこでもindexディレクティブを使用していません。

12
Hubro

ちょうどこれをテストし、それは私にとってはうまくいきます:

server {
    root /tmp/root;
    server {
        listen 8080;
        location /static {
            try_files $uri =404;
        }
        location / {
            rewrite ^ /static/index_debug.html break;
        }
    }
}

ファイル /tmp/root/static/index_debug.htmlはもちろん存在します:)

どのURLにもアクセスでき、静的なページが表示されます。

10
chrskly

Try_filesを使用して、名前付きの場所にリダイレクトします。このような:

server {
    root /tmp/root;
    server {
        listen 8080;

        location / {
            try_files $uri $uri/ @index;
        }

        location @index {
            rewrite ^ static/index_debug.html break;
        }
    }
}

ファイルが/tmp/rootに存在する場合はそれが提供され、そうでない場合はuriがstatic/index_debug.htmlに書き換えられて提供されます。

0
Kirill Zaitsev