Question Nginx wildcard / regex dans le chemin de l'emplacement


La config 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 un 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 réside dans 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, ce qui indique que le test nginx a réussi mais ne charge pas la page, c'est-à-dire 404. Ce que j'ai essayé est:

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

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

Existe-t-il un moyen de créer un chemin d'accès à l'emplacement en tant que regex ou wildcard?


10
2017-10-13 08:35


origine




Réponses:


le = modificateur dans location bloc est une correspondance exacte, sans caractère générique, correspondance de préfixe ni expression régulière. C'est pourquoi ça ne marche pas.

Sur votre tentative de regex, [a-z] correspond à un seul caractère entre a et z. C'est pourquoi cela ne fonctionne pas pour vous.

Vous devez configurer vos emplacements de la manière suivante. Notez l'ordre de location déclarations. nginx sélectionne la première condition d'expression rationnelle correspondante.

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

location ~ \.php$ {
    return 404;
}

J'utilise la 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 la + pour "une ou plusieurs" répétitions.

Le second correspond à n'importe quel 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.


17
2017-10-13 09:42



merci, oui l'essentiel de la répétition était absent de la regex. + corrigé


L'ordre est important, de Description de "l'emplacement" de nginx:

Pour trouver un emplacement correspondant à une requête donnée, nginx commence par vérifier 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é. Ensuite, les expressions régulières sont vérifiées, dans l'ordre d'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 de préfixe précédemment mémorisé est utilisée.

Ça veut dire:

  • Premier =. ("correspondance du préfixe le plus long")
  • Puis implicites. ("correspondance du préfixe le plus long")
  • Puis regex. (premier match)

Vous devez ajuster l'ordre des parties regex.


0
2017-10-13 10:19