Carattere jolly / regex Nginx nel percorso della posizione


22

La configurazione di Nginx che ho lanciato 404 per .phpcome:

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
    return 404;
}

Tuttavia ho un file index.php nella sottocartella che voglio eseguire. L'attuale configurazione è come:

location = /sitename/subpage/index.php {
    fastcgi_pass phpcgi; #where phpcgi is defined to serve the php files
}

location = /sitename/subpage2/index.php {
    fastcgi_pass phpcgi; 
}

location = /sitename/subpage3/index.php {
    fastcgi_pass phpcgi; 
}

funziona perfettamente, ma il problema è posizioni duplicate e se ci sono molte sottopagine, la configurazione diventa enorme.

Ho provato il carattere jolly come * e un po 'di regex, che dice che il test nginx è passato ma non carica la pagina cioè 404. Quello che ho provato sono:

location = /sitename/*/index.php {
    fastcgi_pass phpcgi;
}

location ~* ^/sitename/[a-z]/index.php$ {
    fastcgi_pass phpcgi;
}

Esiste un modo in cui posso avere un percorso nella posizione come regex o jolly?

Risposte:


32

Il =modificatore in locationblocco è una corrispondenza esatta, senza caratteri jolly, corrispondenza del prefisso o espressioni regolari. Ecco perché non funziona.

Nel tuo tentativo regex, [a-z]abbina un singolo personaggio tra ae z. Ecco perché non funziona per te.

È necessario che le posizioni siano impostate come segue. Nota l'ordine delle locationdichiarazioni. nginx seleziona la prima condizione regex corrispondente.

location ~ ^/sitename/[0-9a-z]+/index.php$ {
    fastcgi_pass phpcgi;
}

location ~ \.php$ {
    return 404;
}

Uso la corrispondenza sensibile al maiuscolo / minuscolo qui ( ~modificatore anziché ~*). Nel primo caso, abbino la prima parte del percorso, quindi uno o più numeri di caratteri alfabetici / numerici e quindi index.php. Puoi modificare l'intervallo di partite, ma ricorda le +ripetizioni "una o più".

Il secondo corrisponde a qualsiasi URI che termina con .php. Non hai bisogno dei caratteri extra nella tua versione a causa del modo in cui funzionano le espressioni regolari.


grazie, sì, la cosa principale mancava ripetizione dal regex. +aggiustato.

1

L'ordine è importante, dalla descrizione della "posizione" di nginx :

Per trovare la posizione corrispondente a una determinata richiesta, nginx controlla innanzitutto le posizioni definite usando le stringhe di 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.

Significa:

  • Primo =. (corrispondenza "prefisso corrispondente più lungo")
  • Quindi quelli impliciti. (corrispondenza "prefisso corrispondente più lungo")
  • Quindi regex. (prima partita)

È necessario regolare l'ordine delle parti regex.

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.