660 Stimmen

Nginx - Verwirrung bei der Bereitstellung statischer Dateien mit Root und Alias

Ich muss meine Anwendung über meinen Anwendungsserver unter 8080 und meine statischen Dateien aus einem Verzeichnis, ohne den App-Server zu berühren.

    # 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;
            }
    }

Jetzt, mit dieser Konfiguration, funktioniert alles einwandfrei. Beachten Sie, dass die root ist auskommentiert.

Wenn ich aktiviere root und deaktivieren Sie die alias funktioniert es nicht mehr. Wenn ich jedoch das nachgestellte /static/ de root beginnt es wieder zu funktionieren.

Kann mir jemand erklären, was hier los ist?

1461voto

treecoder Punkte 39241

Es gibt einen sehr wichtigen Unterschied zwischen dem root und die alias Richtlinien. Dieser Unterschied besteht in der Art und Weise, wie der in der Direktive root oder die alias verarbeitet wird.

root

  • die location Teil wird angehängt an root Teil
  • endgültiger Pfad = root + location

alias

  • die location Teil wird ersetzt durch den alias Teil
  • endgültiger Pfad = alias

Zur Veranschaulichung:

Nehmen wir an, wir haben die Konfiguration

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

In diesem Fall wird der endgültige Pfad, den Nginx ableitet, sein

/var/www/app/static/static

Dies wird zurückkehren 404 denn es gibt keine static/ innerhalb static/

Der Grund dafür ist, dass der Ortsteil an den Pfad angehängt wird, der in der Datei root . Daher ist mit root ist der richtige Weg

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

Auf der anderen Seite, mit alias erhält der Ortsteil fallen gelassen . Also für die Konfiguration

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

wird der endgültige Pfad korrekt gebildet als

/var/www/app/static

In gewisser Weise ist das sinnvoll. Die alias ermöglicht es Ihnen, einen neuen Pfad zu definieren, der einen bestehenden "echten" Pfad darstellt. Der Ortsteil ist dieser neue Pfad und wird daher durch den echten Pfad ersetzt. Stellen Sie sich das wie einen Symlink vor.

Root hingegen ist kein neuer Pfad, sondern enthält einige Informationen, die mit anderen Informationen abgeglichen werden müssen, um den endgültigen Pfad zu erstellen. Der Standortteil wird also verwendet und nicht weggelassen.

Der Fall des nachgestellten Schrägstrichs in alias

Es gibt keine endgültige Richtlinie darüber, ob ein nachgestellter Schrägstrich per Nginx-Dokumentation aber eine häufige Beobachtung von Menschen hier und anderswo scheint darauf hinzudeuten, dass es so ist.

An einigen weiteren Stellen wurde dies erörtert, allerdings nicht abschließend.

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

162voto

liuzhijun Punkte 4119

Wie @treecoder sagen

Im Falle der root Direktive wird der vollständige Pfad einschließlich des Ortsteils an den Root angehängt, während im Falle der alias wird nur der Teil des Pfades, der NICHT den Ortsteil enthält, an den Alias angehängt.

Ein Bild sagt mehr als tausend Worte

für root :

enter image description here

für alias :

enter image description here

45voto

antonbormotov Punkte 1751

In Ihrem Fall können Sie Folgendes verwenden root Richtlinie, denn $uri Teil des location Richtlinie ist die gleiche wie die letzte root Teil der Richtlinie.

Nginx-Dokumentation rät ebenfalls dazu:
Wenn der Ort mit dem letzten Teil des Wertes der Richtlinie übereinstimmt:

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

ist es besser, stattdessen die Richtlinie Root zu verwenden:

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

et root Richtlinie wird angehängt $uri auf den Weg.

27voto

meloncholy Punkte 2022

Nur eine kurze Ergänzung zu @good_computer's sehr hilfreiche Antwort, ich wollte zu Root der URL mit einem Ordner zu ersetzen, aber nur, wenn es einen Unterordner mit statischen Dateien (die ich als Teil des Pfades beibehalten wollte) übereinstimmt.

Wenn zum Beispiel die angeforderte Datei in /app/js o /app/css , schauen Sie rein /app/location/public/[that folder] .

Ich habe das mit einer Regex zum Laufen gebracht.

 location ~ ^/app/((images/|stylesheets/|javascripts/).*)$ {
     alias /home/user/sites/app/public/$1;
     access_log off;
     expires max;
 }

10voto

Yao Zhao Punkte 4103

alias wird verwendet, um den Standortteilpfad (LPP) im Anfragepfad zu ersetzen, während der root wird dem Anfragepfad vorangestellt.

Es gibt zwei Möglichkeiten, den Anforderungspfad dem endgültigen Dateipfad zuzuordnen.

alias kann nur im Standortblock verwendet werden und überschreibt den äußeren root .

alias y root können nicht gemeinsam im Ortsblock verwendet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X