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.txt
und 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.txt
also von aus bedient, /home/www/static/robots.txt
weil /robots.txt
das /robots.txt
Präfix der leere String ist und der leere String /home/www/static/robots.txt
angehängt wird, um ihn unverändert zu lassen. Aber /robots.txt1
würde von serviert /home/www/static/robots.txt1
und /robots.txt/foobar
wü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.txt
es 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.txt
was 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_files
Direktive das Verhalten von root
/ ändert alias
und es Einschränkungen gibt, wo alias
verwendet werden kann.
=
in beiden Fällen eine verwenden, oder? Oder gilt das nur fürroot
? Siehe auch meine Bearbeitung - ich wollte nicht beide gleichzeitig verwenden. :)