it-swarm.com.de

Nginx - root versus alias für die Bereitstellung einzelner Dateien?

Nach vielen Stunden nginx, um einzelne Dateien wie robots.txt (Hinweis: Leere jedes Mal deinen Browser-Cache ), ich habe zwei verschiedene Möglichkeiten gefunden, eine mit dem Alias Direktive, und eine, die die Direktive root verwendet, wie folgt:

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 Sicherheitsprobleme? Konflikte mit anderen Richtlinien? (Beide schienen mit einem anderen/statischen Ort in Ordnung zu sein). Oder einen Grund, einen über den anderen zu wählen?

Hinweis - Ich habe nicht beide gleichzeitig verwendet :) Vielmehr habe ich jeden einzeln ausprobiert und beide haben funktioniert. Ich frage nicht, wie beide in derselben Datei miteinander interagieren, sondern welche besser zu verwenden wäre.

69
Cyclops

Nun, diese beiden Anweisungen unterscheiden sich geringfügig funktional, da Sie im letzteren Fall keine exakte Übereinstimmung verwenden. Damit, /robots.txt1111 passt auch zu Ihrem zweiten Standort.
location =/robots.txt { root /home/www/static/; } ist ein genaues funktionales Äquivalent Ihrer ersten Direktive.

74
Alex

Ja, es gibt einen Unterschied: Mit "Alias" können Sie .. nun Alias ​​zu einem anderen Dateinamen, wie

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 Roboterdateien auf meinem Server als tld.domain.subdomain-robots.txt benennen möchte. z.B

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

Ich denke, es lohnt sich explizit darzulegen, 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 das Zeichenfolgenpräfix /robots.txt im URL-Pfad durch /home/www/static/robots.txt und verwendet das Ergebnis dann als Dateisystempfad. Als Pseudocode dargestellt, wäre dies ungefähr so:

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

/robots.txt Wird also von /home/www/static/robots.txt Bereitgestellt, da /robots.txt Ohne das Präfix /robots.txt Die leere Zeichenfolge ist und die leere Zeichenfolge an /home/www/static/robots.txt Angehängt wird. lässt es unverändert. Aber /robots.txt1 Würde von /home/www/static/robots.txt1 Und /robots.txt/foobar Von /home/www/static/robots.txt/foobar Bedient. Diese Dateien sind möglicherweise nicht vorhanden, sodass nginx eine 404-Antwort sendet, und es ist wahrscheinlich, dass robots.txt Ohnehin kein Verzeichnis ist, aber nginx weiß das nicht im Voraus, und dies alles basiert auf Zeichenfolgenpräfixen und nicht Was als Datei oder Verzeichnis erscheint , wenn kein abschließender Schrägstrich vorhanden ist.

Im zweiten Fall hingegen

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 dann als Dateisystempfad. Im Pseudocode wäre dies ungefähr so:

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 /robots.txt Enthalten muss, beginnen die Dateisystempfade immer mit /home/www/static//robots.txt, Was entspricht/home/www/static/robots.txt.

Natürlich erzählt der Pseudocode nicht die ganze Geschichte, wie z. nginx verwendet nicht blind rohe URL-Pfade wie /../../../etc/passwd, die Anweisung try_files ändert das Verhalten von root/alias, und es gibt Einschränkungen, wo alias kann verwendet werden.

3
kbolino

Es gibt einen Unterschied, wenn der Alias ​​für ein ganzes Verzeichnis gilt.

    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)

0
BurninLeo