come rimuovere il blocco di posizione da $ uri nella configurazione di nginx?


16

Ho una riscrittura nel mio file conf di ngix che funziona correttamente tranne che sembra includere il blocco di posizione come parte della variabile $ uri. Voglio solo il percorso dopo il blocco posizione. Il mio attuale codice di configurazione è:

location /cargo {
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

Utilizzando un URL di esempio del http://localhost/cargo/testpagereindirizzamento funziona, tuttavia il valore del parametro "_REWRITE_COMMAND" ricevuto dal mio file php è "/ cargo / testpage". Devo rimuovere il blocco di posizione e avere solo "testpage" come $ uri

Sono abbastanza sicuro che esiste una sintassi regex per dividere $ uri e assegnarlo a una nuova variabile usando $ 1 $ 2 ecc., Ma non riesco a trovare alcun esempio per fare solo un'assegnazione variabile usando una regex che non fa parte di una riscrittura dichiarazione. Ho cercato e provato per ore e non riesco proprio a superare questo ultimo passo.

So anche che potrei semplicemente rimuoverlo sul codice dell'applicazione, ma il motivo per cui voglio provare a risolverlo nella conf di Nginx è per motivi di compatibilità poiché funziona anche su Apache. Dovrei anche dire di aver escogitato un modo davvero confuso per farlo, ma comporta un'istruzione "if" per verificare l'esistenza dei file e la documentazione dice specificamente di non farlo in quel modo.

Risposte:


18

Guardandomi intorno, immagino che usare una posizione regexp con le acquisizioni sia il più semplice. Adattando il tuo esempio finisco con:

location ~ ^/cargo(.*) {
    try_files $1 $1/ /cargo/index.php?_REWRITE_COMMAND=$1&args;
}

aha, così semplice quando qualcuno te lo indica! Ho dovuto fare alcune revisioni minori per gestire la riscrittura dell'URL di root nella posizione corretta. Ho inserito la risposta nella domanda poiché non posso eseguire alcuna formattazione in questo commento. L'unica avvertenza rimasta è che il blocco php ora deve essere sopra questo blocco posizione oppure viene creato un loop di reindirizzamento infinito (a causa del fatto che / cargo è una regex e l'URL di reindirizzamento contiene anche / cargo). non sei sicuro che ci sia un altro modo per impedire che ciò accada?
Jason,

Consiglio di leggere sull'ordinamento delle posizioni regexp e non regexp. Di solito passo a far regexp tutte le posizioni a un certo punto perché l'ordinamento è determinato dall'ordine nel file di configurazione anziché dalla specificità della corrispondenza.
Theuni,

bene grazie, immaginavo che cosa avrebbe reso migliore la regex sopra se fosse / cargo / (qualsiasi cosa tranne index.php), che avrebbe impedito l'errore del server a causa di un ciclo di riscrittura infinito.
Jason,

3

Ho trovato un'altra cosa che ha funzionato per me (poiché sto usando il gunicorn, non riesco a scegliere cosa passare)

Dovresti essere in grado di cavartela

location /cargo {
    rewrite ^/cargo(.*)$ $1 break;
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

1

Per coloro che potrebbero avere difficoltà ad aggiungerlo per il micro servizio o l'API con Nodo JS, ho usato quanto segue per rimuovere apidall'URL sul mio server:

location ^~ /api {
        rewrite ^/api(/.*)$ $1 break;
        proxy_pass    http://127.0.0.1:3001/;
    }
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.