web-dev-qa-db-ja.com

Nginx - ルートとエリアスとの混乱を招く静的ファイル

私は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を無効にすると - 動作しなくなります。ただし、rootから末尾の/static/を削除すると、再び機能し始めます。

何が起こっているのか説明できますか。また、rootaliasの違い、およびその目的について、明確かつ詳細に説明してください。

373
treecoder

私は私の混乱に対する答えを見つけました。

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

rootディレクティブの場合、フルパスがルートに追加されます ロケーション部分を含む一方、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部分はdrops)になります。

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

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

/var/www/app/static

こちらのドキュメントを参照してください。 http://wiki.nginx.org/HttpCoreModule#alias

913
treecoder

@treecoderのように言うと

rootディレクティブの場合、絶対パスはロケーション部分を含むルートに追加されますが、aliasディレクティブの場合、ロケーション部分を含まないパスの部分のみがエイリアスに追加されます。

絵は千語の価値がある

rootの場合:

enter image description here

aliasの場合:

enter image description here

74
liuzhijun

rootディレクティブの$uri部分は最後のlocationディレクティブ部分と同じであるため、あなたのケースではrootディレクティブを使用できます。

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

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

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

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

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

31
antonbormotov

@ good_computerの非常に役に立つ答えのほんのちょっとした補遺です。私はURLのルートをフォルダーに置き換えることを望みましたが、それは静的ファイルを含むサブフォルダー(パスの一部として保持したい)と一致した場合だけです。

たとえば、要求されたファイルが/app/jsまたは/app/cssにある場合、/app/location/public/[that folder]を調べます。

私はこれを正規表現を使って動作させることができました。

 location ~ ^/app/((images/|stylesheets/|javascripts/).*)$ {
     alias /home/user/sites/app/public/$1;
     access_log off;
     expires max;
 }
18
meloncholy
server {
    server_name xyz.com;
    root /home/ubuntu/project_folder/;

    client_max_body_size 10M;
    access_log  /var/log/nginx/project.access.log;
    error_log  /var/log/nginx/project.error.log;

    location /static {
        index index.html;
    }

    location /media {
        alias /home/ubuntu/project/media/;
    }
}

Nginxで静的ページを生きるためのサーバーブロック。

2
Tapish

言い換えれば、この簡潔さを保つために:rootの場合、指定されたlocation引数は ファイルシステムのパスとURI の一部です。一方、locationステートメントのaliasディレクティブ引数は URIのみの一部です

そのため、aliasは特定のURIをファイルシステム内の特定のパスにマッピングする別の名前ですが、rootrootディレクティブの引数として指定されたルートパスにlocation引数を追加します。

1
Twissell

aliasはリクエストパスのロケーションパートパス(LPP)を置き換えるために使用され、rootはリクエストパスの先頭に追加されるために使用されます。

リクエストパスを最終ファイルパスにマッピングするには、2つの方法があります。

aliasはlocationブロックでのみ使用でき、外側のrootをオーバーライドします。

aliasrootをロケーションブロックで一緒に使用することはできません。

0
Yao Zhao