web-dev-qa-db-fra.com

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

La configuration Nginx que j'ai jette 404 pour .php comme:

## 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?

25
user156477

Le = le modificateur dans le bloc location est une correspondance exacte, sans caractères génériques, correspondance de préfixe ni 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 a et z. Voilà pourquoi cela ne fonctionne pas pour vous.

Vous devez configurer vos emplacements comme suit. Notez l'ordre des instructions location. 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 une correspondance sensible à la casse ici (~ 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 le + pour "une ou plusieurs" répétitions.

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.

32
Tero Kilkanen

L'ordre est important, à partir de 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:

  • Première =. (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.

1
Gea-Suan Lin