585

のアプリ サーバーを介してアプリを提供し、アプリ サーバーに8080触れずにディレクトリから静的ファイルを提供する必要があります。私が持っているnginxの設定はこのようなものです...

    # app server on port 8080
    # nginx listens on port 8123
    server {
            listen          8123;
            access_log      off;

            location /static/ {
                    # root /var/www/app/static/;
                    alias /var/www/app/static/;
                    autoindex off;
            }


            location / {
                    proxy_pass              http://127.0.0.1:8080;
                    proxy_set_header        Host             $host;
                    proxy_set_header        X-Real-IP        $remote_addr;
                    proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;
            }
    }

さて、この構成では、すべてが正常に機能しています。rootディレクティブはコメントアウトされていることに注意してください。

--を有効rootにして無効にすると、機能しaliasなくなります。ただし、末尾を削除すると、/static/再びroot機能し始めます。

誰かが何が起こっているのか説明できますか。また、 と の違いとその目的を明確かつ詳細に説明してrootくださいalias

4

8 に答える 8

1297

rootaliasディレクティブの間には非常に重要な違いがあります。rootこの違いは、またはで指定されたパスのalias処理方法に存在します。

root

  • パーツはパーツlocationに追加されますroot
  • 最終パス= root+location

alias

  • パーツはパーツlocationに置き換えられますalias
  • 最終パス=alias

説明する:

設定があるとしましょう

location /static/ {
    root /var/www/app/static/;
    autoindex off;
}

この場合、Nginxが導出する最終的なパスは次のようになります

/var/www/app/static/static

404中にはないのでこれは戻ってきstatic/ますstatic/

これは、ロケーション部分がで指定されたパスに追加されるためrootです。したがって、を使用するrootと、正しい方法は次のようになります。

location /static/ {
    root /var/www/app/;
    autoindex off;
}

一方、を使用するaliasと、ロケーション部分が削除されます。だから設定のために

location /static/ {
    alias /var/www/app/static/;
    autoindex off;           ↑
}                            |
                             pay attention to this trailing slash

最終パスは次のように正しく形成されます

/var/www/app/static

ある意味で、これは理にかなっています。既存のalias「実際の」パスを表す新しいパスを定義しましょう。ロケーション部分はその新しいパスであるため、実際のパスに置き換えられます。シンボリックリンクと考えてください。

一方、ルートは新しいパスではなく、最終的なパスを作成するために他の情報と照合する必要のある情報が含まれています。したがって、ロケーション部分はドロップされずに使用されます。

末尾のスラッシュの場合alias

Nginxのドキュメントでは、末尾のスラッシュが必須かどうかについての明確なガイドラインはありませんが、ここや他の場所での一般的な観察では、必須であることが示されているようです。

しかし、決定的なものではありませんが、さらにいくつかの場所でこれについて議論されています。

https://serverfault.com/questions/376162/how-can-i-create-a-location-in-nginx-that-works-with-and-without-a-trailing-slas

https://serverfault.com/questions/375602/why-is-my-nginx-alias-not-working

于 2012-05-18T05:18:29.383 に答える
136

@treecoderのように

ディレクティブの場合root、場所の部分を含むルートにフル パスが追加されますが、aliasディレクティブの場合、場所の部分を含まないパスの部分のみがエイリアスに追加されます。

百聞は一見に如かず

の場合root:

ここに画像の説明を入力

の場合alias:

ここに画像の説明を入力

于 2016-10-09T03:03:54.240 に答える
41

あなたの場合、ディレクティブの一部が最後のディレクティブ部分と同じであるrootため、ディレクティブ$uriを使用できます。locationroot

Nginxのドキュメントでも同様にアドバイスされています:
場所がディレクティブの値の最後の部分と一致する場合:

location /images/ {
    alias /data/w3/images/;
}

代わりにルート ディレクティブを使用することをお勧めします。

location /images/ {
    root /data/w3;
}

rootディレクティブはパスに追加さ$uriれます。

于 2015-07-01T06:03:02.857 に答える