Impossible de comprendre une règle htaccess

9

J'ai ceci dans mon htaccess mais je ne peux pas comprendre à quoi ça sert. En raison de la nature de la règle, la recherche n'aide pas non plus.

RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301]

Quelqu'un peut-il expliquer à quoi cela sert?

Richard1984
la source
Si la partie de la demande (la partie de l'URL après ".com") ne se termine pas par un /et qu'elle ne contient pas de " .", redirigez la demande en l'ajoutant avec un /. L'intention probable de cette règle est de gérer l'indexation automatique des répertoires.
peterh

Réponses:

11

Tout ce que cette règle fait, c'est d'ajouter une fin /à votre URL s'il n'y en a pas et s'il n'y en a pas .dans l'URI, elle https://example.org/testsera donc redirigée vers https://example.org/test/, mais https://example.org/test.htmlne sera pas réécrite vers https://example.org/test.html/(mais remarque: https://example.org/test.case/folderne sera pas non plus redirigée vers https://example.org/test.case/folder/car elle contient a .dans l'URI).

## Do the following if the URI does not end with `/` or  does not contain an `.`: 
## the . is relevant for file names like test.html, which should n 
RewriteCond %{REQUEST_URI} !(/$|\.)

## Redirect it to the original URI with an added `/` and mark this as permanent:
RewriteRule (.*) %{REQUEST_URI}/ [R=301]
Sven
la source
" /test.case/folderne sera pas non plus redirigé" - Point mineur, mais si "dossier" est un répertoire de système de fichiers, alors mod_dir émettra (par défaut) une redirection 301 pour ajouter une barre oblique de fin. Ce n'est un problème que si cela /test.case/some-other-virtual-urldoit avoir une barre oblique.
MrWhite
6

Sans valider, mais en utilisant mon expérience en réécriture Apache, cette configuration semble:

  1. Correspondance sur la partie 'chemin' de l'URI (pas sur le serveur, le port ou les paramètres de requête), par exemple '/my/location/file.html'.
  2. Correspond si cette partie ne se termine pas par un caractère '/' (barre oblique), -ou- n'inclut pas de '.' (point).
  3. Utilisez la partie chemin complet de l'URI et ajoutez-y une barre oblique.
  4. Envoyez une redirection HTTP 301 (permanente) pour diriger le navigateur vers ce nouvel URI.

Cela se traduira par les cas de test suivants

/ -> / /test -> /test/ /my/resource -> /my/resource/ /my/resource.type -> /my/resource.type /edge.case/resource -> /edge.case/resource

Je pense donc que la règle a pour but d'ajouter des barres obliques aux ressources qui ne semblent pas être un fichier, mais il semble avoir un cas de bord.

Si vous n'ajoutez pas de barre oblique à une ressource avec '.' (point) dans la partie non fichier du chemin d'accès, l'expression régulière doit être remplacée par:

# match paths which do not end with a slash, or do not resemble a file with an extension
RewriteCond %{REQUEST_URI} !(/$|\.[^/]+$)
# redirect permanently to the same uri with a slash
RewriteRule (.*) %{REQUEST_URI}/ [R=301]
Joffrey
la source
!(\/$|\.[^\/]*)- Votre regex mis à jour n'est vraiment pas différent. Vous avez également besoin d'une ancre de fin de chaîne sur la 2ème partie (qui correspond à l'extension). Peut-être quelque chose comme: !(/|\.[a-zA-Z]+)$(pas besoin d'échapper aux barres obliques).
MrWhite
@MrWhite Bonne prise! J'ai mis à jour ma réponse!
Joffrey