Penso che valga la pena esplicitamente stabilire che nginx opera su prefissi e non su file di per sé. Nel primo caso,
location /robots.txt { alias /home/www/static/robots.txt; }
nginx sostituisce il prefisso stringa /robots.txt
nel percorso URL con /home/www/static/robots.txt
e quindi utilizza il risultato come percorso del filesystem. Rappresentato come pseudocodice, sarebbe qualcosa del tipo:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/robots.txt" + urlPath.stripPrefix("/robots.txt")
serveFile(fsPath)
}
Quindi /robots.txt
viene servito /home/www/static/robots.txt
perché /robots.txt
rimosso dal /robots.txt
prefisso è la stringa vuota e aggiungendo la stringa vuota per /home/www/static/robots.txt
lasciarla invariata. Ma /robots.txt1
sarebbe servito da /home/www/static/robots.txt1
e /robots.txt/foobar
sarebbe servito da /home/www/static/robots.txt/foobar
. Questi file potrebbero non esistere, facendo sì che nginx invii una risposta 404, ed è probabile che robots.txt
non sia comunque una directory, ma nginx non lo sa in anticipo, e questo è tutto basato su prefissi di stringa e non su ciò che sembra essere un file o directory per l'assenza o la presenza di una barra finale.
Considerando che, nel secondo caso,
location /robots.txt { root /home/www/static/; }
nginx inserisce la stringa /home/www/static/
all'inizio del percorso URL e quindi utilizza il risultato come percorso del file system. In pseudocodice, questo sarebbe qualcosa del tipo:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/" + urlPath
serveFile(fsPath)
}
Questo ha esattamente lo stesso risultato del primo caso, ma per una ragione diversa. Non c'è strippaggio prefisso, ma dal momento che ogni percorso URI deve contenere il prefisso /robots.txt
, quindi i percorsi di file system sarà sempre iniziare con /home/www/static//robots.txt
il quale è equivalente a /home/www/static/robots.txt
.
Naturalmente, lo pseudocodice non racconta completamente l'intera storia, poiché ad esempio nginx non utilizzerà ciecamente percorsi URL grezzi come /../../../etc/passwd
, la try_files
direttiva modifica il comportamento di root
/ alias
e ci sono vincoli su dove alias
può essere utilizzato.
=
in entrambi i casi, giusto? O si applica solo aroot
? Inoltre, guarda la mia modifica: non intendevo usarli entrambi contemporaneamente. :)