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.
=in beiden Fällen eine verwenden, oder? Oder gilt das nur fürroot? Siehe auch meine Bearbeitung - ich wollte nicht beide gleichzeitig verwenden. :)