Pourquoi RewriteRule pour « ^//(.*) » (commence par une double barre oblique) ne redirige-t-il pas vers une seule barre oblique ?

Aug 17 2020

Avoir cette règle de réécriture dans le contexte vHost. Mais il ne réécrit pas les requêtes commençant par //.*(double barre oblique). Il suffit de les servir à partir de /.*(single slash) au lieu de répondre avec une redirection vers/.*

RewriteRule "^//(.*)" "/$1" [R=301,L]

Pourquoi cela ne fonctionne-t-il pas ?

Réponses

2 MrWhite Aug 18 2020 at 06:51
RewriteRule "^//(.*)" "/$1" [R=301,L]

Cela ne correspondra jamais car le chemin d'URL auquel le RewriteRule modèle correspond a déjà eu toutes les instances de plusieurs barres obliques réduites à une seule barre oblique.

Pour rediriger de telles requêtes, vous pouvez utiliser cette "fonctionnalité" et simplement rediriger "vers lui-même" et vérifier THE_REQUESTla variable du serveur à la place afin de déterminer si plusieurs barres obliques étaient présentes sur la requête initiale. THE_REQUESTest la première ligne de l'en-tête de la requête et contient l'URL brute de la requête non traitée (à l'exclusion du protocole et du nom d'hôte, mais incluant la chaîne de requête) telle qu'elle est envoyée par le client.

Par exemple, pour rediriger toutes les instances de plusieurs barres obliques vers une seule barre oblique tout au long du chemin de l'URL, pas seulement au début, vous pouvez faire quelque chose comme ceci :

RewriteCond %{THE_REQUEST} \s[^?]*//
RewriteRule (.*) $1 [R=301,L]

L'expression régulière \s[^?]*//garantit que nous ne faisons pas correspondre plusieurs barres obliques dans la partie chaîne de requête de l'URL (ce qui entraînerait sinon une boucle de redirection).


Nous RewriteCond %{THE_REQUEST} ^//permettrait-il d'appliquer la règle de réécriture uniquement à ceux qui commencent par des doubles barres obliques, en ignorant toutes les autres instances de doubles barres obliques ?

Pas tout à fait, THE_REQUESTla variable serveur contient en fait toute la première ligne de l'en-tête de requête HTTP. En d'autres termes, une chaîne de la forme :

GET /foo/bar.html HTTP/1.1

Ou GET //foo/bar.html HTTP/1.1s'il y a une double barre oblique au début du chemin de l'URL, vous auriez besoin de quelque chose comme ceci à la place :

RewriteCond %{THE_REQUEST} \s//[^/]
RewriteRule (.*) $1 [R=301,L]

... afin d'attraper toutes les méthodes de requête. Et plus précisément juste une double barre oblique, pas des triples barres obliques, etc. au début du chemin d'URL uniquement.

\s//[^/]- C'est un espace (après la méthode de requête ) suivi de 2 barres obliques et de quelque chose d'autre qu'une barre oblique (c'est-à-dire soit un espace pour la racine du document, soit un autre chemin d'URL).