Nginx - root versus alias, um einzelne Dateien zu bedienen?

66

Nach vielen Stunden, nginxin denen ich einzelne Dateien wie robots.txt(Hinweis: Leeren Sie jedes Mal den Browser-Cache) bereitgestellt habe, habe ich zwei verschiedene Methoden gewählt, eine mit der Alias- Direktive und eine mit der Root- Direktive:

location /robots.txt { alias /home/www/static/robots.txt; }
location /robots.txt { root /home/www/static/;  }

Gibt es einen funktionalen Unterschied zwischen den beiden? Oder Sicherheitsfragen? Konflikte mit anderen Richtlinien? (Beide schienen gut mit einem anderen / statischen Ort). Oder einen Grund, einen über den anderen zu wählen?

Hinweis - Ich habe nicht beide gleichzeitig verwendet :) Eher habe ich jeden nach dem anderen ausprobiert und beide haben funktioniert. Ich frage nicht, wie die beiden in derselben Datei zusammenarbeiten, sondern welche am besten zu verwenden wäre.

Zyklop
quelle

Antworten:

71

Nun, diese beiden Direktiven sind leicht funktional unterschiedlich, da Sie im letzteren Fall keine exakte Übereinstimmung verwenden. So /robots.txt1111passt es auch zu Ihrem zweiten Standort.
location =/robots.txt { root /home/www/static/; }ist ein genaues funktionales Äquivalent Ihrer ersten Direktive.

Alex
quelle
Guter Punkt, danke. Aber du kannst =in beiden Fällen eine verwenden, oder? Oder gilt das nur für root? Siehe auch meine Bearbeitung - ich wollte nicht beide gleichzeitig verwenden. :)
Cyclops
@Cyclops ja, du darfst =in beiden Fällen verwenden.
Alexander Azarov
Sie wären also gleich - gibt es einen Grund, eine Richtlinie über die andere zu entscheiden? Ist meine Hauptfrage.
Cyclops
Grundsätzlich gibt es keinen solchen Grund.
Alex
41

Ja, es gibt einen Unterschied: Mit "Alias" können Sie ... auch einen anderen Dateinamen als Alias ​​angeben

location /robots.txt { alias /home/www/static/any-filename.txt; }

wohingegen

location /robots.txt { root /home/www/static/; }

zwingt Sie, Ihre Datei auf dem Server auch robots.txt zu benennen. Ich verwende die erste Option, da ich meine Robots-Dateien auf meinem Server als tld.domain.subdomain-robots.txt bezeichnen möchte. z.B

location /robots.txt { alias /home/www/static/ch.notex.static-robots.txt; }
Hasan Karahan
quelle
1

Ich denke, es lohnt sich ausdrücklich darauf hinzuweisen, dass nginx mit Präfixen und nicht mit Dateien an sich arbeitet. Im ersten Fall,

location /robots.txt { alias /home/www/static/robots.txt; }

nginx ersetzt den String - Präfix /robots.txt im URL - Pfad mit /home/www/static/robots.txtund verwendet dann das Ergebnis als Dateisystem - Pfad. Dargestellt als Pseudocode, würde dies ungefähr so ​​aussehen:

if urlPath.startsWith("/robots.txt") {
    fsPath := "/home/www/static/robots.txt" + urlPath.stripPrefix("/robots.txt")
    serveFile(fsPath)
}

Wird /robots.txtalso von aus bedient, /home/www/static/robots.txtweil /robots.txtdas /robots.txtPräfix der leere String ist und der leere String /home/www/static/robots.txtangehängt wird, um ihn unverändert zu lassen. Aber /robots.txt1würde von serviert /home/www/static/robots.txt1und /robots.txt/foobarwürde von serviert werden /home/www/static/robots.txt/foobar. Diese Dateien sind möglicherweise nicht vorhanden, was dazu führt, dass nginx eine 404-Antwort sendet, und es ist wahrscheinlich, dass robots.txtes sich ohnehin nicht um ein Verzeichnis handelt, aber nginx weiß das nicht im Voraus, und dies alles basiert auf Zeichenfolgepräfixen und nicht auf einer scheinbaren Datei oder Verzeichnis durch das Fehlen oder Vorhandensein eines abschließenden Schrägstrichs.

Im zweiten Fall

location /robots.txt { root /home/www/static/; }

nginx fügt die Zeichenfolge /home/www/static/am Anfang des URL-Pfads ein und verwendet das Ergebnis als Dateisystempfad. Im Pseudocode wäre dies so etwas wie:

if urlPath.startsWith("/robots.txt") {
    fsPath := "/home/www/static/" + urlPath
    serveFile(fsPath)
}

Dies hat genau das gleiche Ergebnis wie der erste Fall, jedoch aus einem anderen Grund. Es gibt kein Entfernen von Präfixen, aber da jeder URI-Pfad das Präfix enthalten muss /robots.txt, beginnen die Dateisystempfade immer mit dem, /home/www/static//robots.txtwas dem entspricht /home/www/static/robots.txt .

Natürlich kann der Pseudocode nicht die ganze Geschichte erzählen, da nginx zB keine unformatierten URL-Pfade verwendet /../../../etc/passwd, die try_filesDirektive das Verhalten von root/ ändert aliasund es Einschränkungen gibt, wo aliasverwendet werden kann.

kbolino
quelle
0

Es gibt einen Unterschied, wenn sich der Alias ​​auf ein ganzes Verzeichnis bezieht.

    location ^~ /data/ { alias /home/www/static/data/; }

wird funktionieren, während

    location ^~ /data/ { root /home/www/static/data/; }

geht nicht Das müsste sein

    location ^~ /data/ { root /home/www/static/; }

(Leicht zu verwechseln)

BurninLeo
quelle