come limitare l'accesso alla directory e ai sottodir


42

Devo limitare l'accesso a qualsiasi file o sottodiretto in "testdir" diretto. La mia conf:

...
location ~* ^.+\.(jpg|txt)$ {
            root   /var/www/site;
        }
location /testdir {
        deny all;
        return 404;
        }
...

Nella mia configurazione non ho restrizioni su / testdir / jpg_or_txt-files. Come farlo?


Nota, nella mia esperienza, la funzione di localizzazione funziona correttamente solo quando si esegue nginx su Linux. Durante l'esecuzione su Windows, abbiamo avuto problemi con questo non funziona ...
Samsmith

Risposte:


43

per limitare l'accesso a più directory in nginx in una voce di posizione fare

...
location ~ /(dir1|dir2|dir3) {
   deny all;
   return 404;
}
...

7
Dovresti restituire 403 e non 404.
Stillmatic1985,

12
Questo non risponde affatto alla domanda.

1
la restituzione del 403 lascia intendere che la cartella esiste, un 404 non fornisce alcuna prova della cartella esistente
Don Wilson,

23

È perché la direttiva "root" corrisponde prima che la direttiva "nega" possa essere abbinata. Invertire l'ordine delle direttive e dovrebbe funzionare:

...
location /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}
...

16

Per assicurarsi che venga scelta la corrispondenza testdir anziché la corrispondenza jpg / txt, utilizzare le seguenti posizioni:

location ^~ /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}

Nel tuo esempio, hai due tipi di posizioni. location /testdirè un prefisso, in quanto non ha tilde ( ~) tra locatione /testdir.

location ~* ^.+\.(jpg|txt)$è una posizione regex (senza distinzione tra maiuscole e minuscole, dovuta *direttamente alla tilde). Dalla documentazione di nginx :

Per trovare la posizione corrispondente a una determinata richiesta, nginx controlla innanzitutto le posizioni definite usando le stringhe del prefisso (posizioni dei prefissi). Tra questi, viene selezionata e ricordata la posizione con il prefisso corrispondente più lungo. Quindi vengono controllate le espressioni regolari, nell'ordine del loro aspetto nel file di configurazione. La ricerca di espressioni regolari termina alla prima corrispondenza e viene utilizzata la configurazione corrispondente. Se non viene trovata alcuna corrispondenza con un'espressione regolare, viene utilizzata la configurazione della posizione del prefisso ricordata in precedenza.

Il problema qui è che la tua posizione testdir viene ricordata, ma poi la posizione jpg / txt viene selezionata durante la fase regex, come corrisponde. La seguente nota della documentazione è su cui ho basato la mia soluzione (indicata sopra) su:

Se la posizione del prefisso corrispondente più lunga ha il modificatore “^ ~”, le espressioni regolari non vengono controllate.


11
location /foo {
    deny all;
    return 404;
}

Questo ti darà sempre un 403 a causa della negazione di tutto ... Quando vuoi che il server ti dia un 404, restituisci solo un 404 ... in questo modo:

location /foo {
    return 404;
}
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.