Nginx - radice contro alias, per servire singoli file?


66

Dopo molte ore passate nginxa servire singoli file come robots.txt(suggerimento: svuota la cache del browser ogni volta), ho finito con due modi diversi, uno usando la direttiva alias e uno usando la direttiva root , in questo modo:

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

C'è qualche differenza funzionale tra i due? O problemi di sicurezza? Eventuali conflitti con altre direttive? (Entrambi sembravano a posto con un'altra / posizione statica). O qualche motivo per sceglierne uno sopra l'altro?

Nota: non ho usato entrambi allo stesso tempo :) Piuttosto ho provato ciascuno, uno alla volta, ed entrambi hanno funzionato. Non sto chiedendo come entrambi interagiscano insieme nello stesso file, ma quale sarebbe meglio usare.

Risposte:


71

Bene, queste due direttive sono leggermente diverse dal punto di vista funzionale in quanto non si utilizza la corrispondenza esatta in quest'ultimo caso. Quindi, /robots.txt1111corrisponderà anche alla tua seconda posizione.
location =/robots.txt { root /home/www/static/; }è un equivalente funzionale esatto della tua prima direttiva.


Buon punto, grazie. Ma puoi usare un =in entrambi i casi, giusto? O si applica solo a root? Inoltre, guarda la mia modifica: non intendevo usarli entrambi contemporaneamente. :)
Ciclope,

@Ciclope sì, è possibile utilizzare =in entrambi i casi.
Alexander Azarov,

Quindi sarebbero gli stessi - c'è qualche motivo per scegliere una direttiva sull'altra? È la mia domanda principale
Ciclope,

@Cyclops Fondamentalmente, non esiste una ragione del genere.
Alex,

41

Sì, c'è una differenza: con "alias" puoi ... beh alias con un altro nome di file, come

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

mentre

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

ti costringe a nominare il tuo file sul server anche robots.txt. Uso la prima opzione poiché mi piace nominare i file dei miei robot sul mio server come tld.domain.subdomain-robots.txt; per esempio

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

1

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.txtnel percorso URL con /home/www/static/robots.txte 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.txtviene servito /home/www/static/robots.txtperché /robots.txtrimosso dal /robots.txtprefisso è la stringa vuota e aggiungendo la stringa vuota per /home/www/static/robots.txtlasciarla invariata. Ma /robots.txt1sarebbe servito da /home/www/static/robots.txt1e /robots.txt/foobarsarebbe 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.txtnon 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.txtil 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_filesdirettiva modifica il comportamento di root/ aliase ci sono vincoli su dove aliaspuò essere utilizzato.


0

C'è una differenza, quando l'alias è per un'intera directory.

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

funzionerà, mentre

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

non lo farà. Questo dovrebbe essere

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

(Facile da confondere)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.