2016-02-10 9 views

risposta

83

Prova

location ~ ^/(first/location|second/location)/ { 
    ... 
} 

Il ~ significa usare un'espressione regolare per l'URL. Il^significa controllare dal primo carattere. Questo cercherà un/seguito da una delle posizioni e poi un altro /.

+11

NOTA: se questo si verifica spesso (come migliaia), si incorrerà in una penalizzazione delle prestazioni a causa di corrispondenza regex. Anche l'ordine di corrispondenza è sostanzialmente diverso. In molti casi "piccoli", si comporterà come si desidera, ma questo è qualcosa su cui stare attenti. Personalmente voglio che Nginx "location" supporti più "=" condizioni invece di fare affidamento su una regola regex. – Bernard

+3

IMHO, questo dovrebbe essere più efficiente: posizione ~ (patternOne | patternTwo) {...} – stamster

+1

Questa soluzione non ha funzionato per me; comunque il commento di @stamster ha fatto; Sto eseguendo 'nginx/1.13.2' –

40

Un'altra opzione è ripetere le regole in due posizioni di prefisso utilizzando un file incluso. Poiché le posizioni dei prefissi sono indipendenti dalla posizione nella configurazione, utilizzarle può far risparmiare confusione quando si aggiungono altre posizioni regex in seguito.

server { 
    location /first/location/ { 
     include shared.conf; 
    } 
    location /second/location/ { 
     include shared.conf; 
    } 
} 

Ecco uno shared.conf campione:

default_type text/plain; 
return 200 "http_user_agent: $http_user_agent 
remote_addr: $remote_addr 
remote_port: $remote_port 
scheme:  $scheme 
nginx_version: $nginx_version 
"; 
+0

puoi aggiungere per favore esempio e posizione' shared.conf'? –

+1

Ho aggiunto un esempio di file shared.conf. Puoi usare un percorso assoluto per shared.conf o metterlo nella tua directory nginx. In questo caso, contiene solo un paio di direttive. –

7

Sia l'espressione regolare e comprendeva file sono buoni metodi, e io spesso uso quelli. Ma un'altra alternativa è usare una posizione con nome, che è un approccio utile in molte situazioni, specialmente quelle più complicate. Gli standard di "If is Evil" page spettacoli essenzialmente quanto segue come un buon modo per fare le cose:

error_page 418 = @common_location; 
location /first/location/ { 
    return 418; 
} 
location /second/location/ { 
    return 418; 
} 
location @common_location { 
    # The common configuration... 
} 
-1

Questo è breve, ma efficace e collaudato approccio:

location ~ (patternOne|patternTwo){ #rules etc. }

Quindi si può facilmente avere più modelli con semplice sintassi della pipe che punta allo stesso blocco/regole di posizione.

-1

Per il caso di successione:

location /first { 
    # do some stuff here, and than go to /base 
    try_files /base; 
} 

location /second { 
    # do some other stuff here, and than go to /base 
    try_files /base; 
} 

location /base { 
    # base stuff here 
} 
+0

È valido? [I documenti] (http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files) suggeriscono che è richiesto almeno un file. Forse hai bisogno di fare qualcosa come 'try_files file_that_will_never_exist.yml/base;'. – Mike

Problemi correlati