Caractère générique / expression régulière Nginx dans le chemin d'accès

22

La configuration Nginx que j'ai jette 404 .phpcomme:

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

Cependant, j'ai un fichier index.php dans le sous-dossier que je veux exécuter. La configuration actuelle est comme:

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; 
}

cela fonctionne parfaitement, mais le problème est les emplacements en double et s'il y a beaucoup de sous-pages, la configuration devient énorme.

J'ai essayé le caractère générique comme * et un regex, qui dit que le test nginx a réussi mais ne charge pas la page, c'est-à-dire 404. Ce que j'ai essayé, c'est:

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

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

Existe-t-il un moyen de disposer d'un chemin d'accès à l'emplacement comme expression régulière ou caractère générique?


la source

Réponses:

32

Le =modificateur en locationbloc est une correspondance exacte, sans caractères génériques, correspondance de préfixe ou expressions régulières. Voilà pourquoi cela ne fonctionne pas.

Lors de votre tentative d'expression régulière, [a-z]correspond à un seul caractère entre aet z. Voilà pourquoi cela ne fonctionne pas pour vous.

Vous devez configurer vos emplacements comme suit. Notez l'ordre des locationdéclarations. nginx sélectionne la première condition regex correspondante.

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

location ~ \.php$ {
    return 404;
}

J'utilise ici une correspondance sensible à la casse ( ~modificateur au lieu de ~*). Dans le premier cas, je fais correspondre la première partie du chemin, puis un ou plusieurs nombres de caractères alphabétiques / numériques, puis index.php. Vous pouvez modifier la plage de correspondance, mais n'oubliez pas les +répétitions "une ou plusieurs".

Le second correspond à tout URI se terminant par .php. Vous n'avez pas besoin des caractères supplémentaires dans votre version en raison du fonctionnement des expressions régulières.

Tero Kilkanen
la source
merci, oui la répétition de chose principale manquait dans l'expression régulière. +l'a corrigé.
1

L'ordre est important, d'après la description de «l'emplacement» de nginx :

Pour trouver un emplacement correspondant à une demande donnée, nginx vérifie d'abord les emplacements définis à l'aide des chaînes de préfixe (emplacements de préfixe). Parmi eux, l'emplacement avec le préfixe correspondant le plus long est sélectionné et mémorisé. Les expressions régulières sont ensuite vérifiées, dans l'ordre de leur apparition dans le fichier de configuration. La recherche d'expressions régulières se termine à la première correspondance et la configuration correspondante est utilisée. Si aucune correspondance avec une expression régulière n'est trouvée, la configuration de l'emplacement du préfixe mémorisé précédemment est utilisée.

Ça veut dire:

  • D'abord =. (correspondance "préfixe correspondant le plus long")
  • Puis implicites. (correspondance "préfixe correspondant le plus long")
  • Puis regex. (premier match)

Vous devez ajuster l'ordre des pièces d'expression régulière.

Gea-Suan Lin
la source