
Barres obliques de fin & nginx
Lorsque vous utilisez nginx et que vous diffusez du code HTML brut, vous pouvez rencontrer un problème courant : l'URI doit se comporter d'une manière spécifique que vous avez définie. Sinon, votre site risque de ne pas fonctionner correctement ou même de renvoyer un écran d'erreur à l'utilisateur.
Par exemple, vous avez réalisé une
exportation statique avec Next.js
avec un paramètre "pas de barre oblique de fin", de sorte que vos utilisateurs
sont censés accéder à "/page". Ainsi, vous diffuserez votre site avec
cette directive nginx : try_files $uri $uri.html $uri/ =404;
.
Et du coup, l'accès à "/page/" renverra une erreur 404 à l'utilisateur !
Bien sûr, nous devons le corriger. Laissez-moi vous expliquer comment.
(Oui. J'ai vraiment écrit un article entier à ce sujet. Après tout, vous pouvez apprendre la regex avec moi !)
Sommaire
Il faut de barres obliques de fin

Pour forcer les URI à se terminer par une barre oblique dans nginx, utilisez cette redirection :
Celui-ci capture toutes les URI correspondant à l'expression régulière ^(.+[^/])$
(cela semble incompréhensible mais je vais vous l'expliquer) :
^
et$
signifient le début et la fin de l'URI ;()
, ou simplement des parenthèses, signifient capturer la valeur à l'intérieur dans un "groupe regex". Comme il s'agit du premier (et le seul) groupe, il est accessible dans nginx via$1
;.+
signifie une séquence de n'importe quel caractère et de n'importe quelle longueur (presque l'URI entière disons) ;- et
[^/]
s'agit de tout autre caractère qui n'est pas une barre oblique. Dans nginx, vous n'avez pas besoin de l'échapper comme ceci :[^\/]
.
De cette façon, toutes les demandes d'URI ne se terminant pas par une barre oblique entreront
et exécuteront ainsi la directive "return 301", indiquant effectivement au client que
la page réside sur une autre URL (avec un URI d'origine récupéré de l'expression régulière
en tant que groupe 1 ou $1
+ une barre oblique ajoutée à la fin).
Je vous rappelle que c'est à vous de gérer les routes de votre serveur web !
Notamment la racine, le /
. Vous pouvez configurer cette regex selon vos besoins
(comme utiliser .*
au lieu de .+
pour également capturer le cas où il n'y a rien
à gauche de la barre. Là encore, c'est à vous d'aller essayer).
Cette technique est basée sur la redirection. Vous pouvez utiliser la directive "rewrite" à la place (trouvée en ligne ailleurs). Je vous donne juste l'exemple de ce qui me semble le plus correct.
Maintenant, accéder à "/page" nous amènera à "/page/". Accéder directement à "/page/" ne fera rien d'autre et la page sera simplement chargée.
Il faut pas de barres obliques de fin

Afin de forcer les URL à ne pas se terminer par une barre oblique dans nginx, utilisez cette redirection :
Celui-ci capture tous les URI correspondant à l'expression régulière ^(.+)/$
:
^
et$
signifient le début et la fin de l'URI ;(.+)
signifie une séquence de n'importe quel caractère et de n'importe quelle longueur (presque l'URI entière, disons). En mettant un point (n'importe quel caractère) et un plus (n'importe quelle longueur à partir de 1) entre parenthèses, nous capturons cette valeur comme groupe regex 1 ou$1
dans nginx ;- et
/
s'agit de la barre oblique à la fin de la chaîne que nous recherchons. Dans nginx, vous n'avez pas besoin de l'échapper comme\/
. Notez comment elle se trouve en dehors des parenthèses. Elle ne fait pas partie du groupe 1.
De cette façon, toutes les demandes d'URI se terminant par une barre oblique
entreront et exécuteront ainsi la directive "return 301", indiquant effectivement au client que
la page réside sur une autre URL (avec un URI ne contenant pas de barre oblique extraite de
l'expression régulière en tant que groupe 1 ou $1
).
Ainsi, votre bloc de serveur final pourrait ressembler à :
Et maintenant, accéder à "/page" ne fera rien et chargera simplement la page. Accéder à "/page/" nous amènera à "/page", évitant ainsi, par exemple, l'erreur 404 dont j'ai parlé dans l'intro.
Apache
Désolé, il n'y aura pas de guide Apache car je n'en ai pas l'expérience. Cependant, si vous en avez, vous pouvez contribuer ici en m'envoyant un e-mail.
Ah, avez-vous vu mon secret ?
Salut !