Ich kann keine Zugriffsregel herausfinden

9

Ich habe dies in meinem Zugriff, kann aber nicht herausfinden, wofür es ist. Aufgrund der Art der Regel hilft die Suche auch nicht.

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

Kann jemand bitte erklären, wofür es ist?

Richard1984
quelle
Wenn der Anforderungsteil (der Teil der URL nach ".com") nicht mit a /endet und kein " ." enthält, leiten Sie die Anforderung um, indem Sie sie mit a anhängen /. Die wahrscheinliche Absicht dieser Regel besteht darin, die automatische Verzeichnisindizierung durchzuführen.
Peter

Antworten:

11

Alles, was diese Regel bewirkt, ist, /Ihren URLs ein Trailing hinzuzufügen, wenn es keine gibt und wenn es keine .in der URI gibt, https://example.org/testwird diese umgeleitet https://example.org/test/, aber https://example.org/test.htmlnicht umgeschrieben https://example.org/test.html/(aber Hinweis: https://example.org/test.case/folderwird auch nicht umgeleitet, https://example.org/test.case/folder/wie sie enthält a .in der 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
quelle
" /test.case/folderwird auch nicht umgeleitet" - Kleiner Punkt, aber wenn "Ordner" ein Dateisystemverzeichnis ist, gibt mod_dir (standardmäßig) eine 301-Umleitung aus, um einen abschließenden Schrägstrich anzuhängen. Es ist nur dann ein Problem, wenn es /test.case/some-other-virtual-urleinen abschließenden Schrägstrich geben sollte.
MrWhite
6

Ohne zu validieren, aber unter Verwendung meiner Erfahrung beim Umschreiben von Apache, scheint diese Konfiguration:

  1. Übereinstimmung mit dem 'Pfad'-Teil des URI (nicht den Server-, Port- oder Abfrageparametern), z. B.' /my/location/file.html '.
  2. Übereinstimmung, wenn dieser Teil nicht mit einem '/' (Schrägstrich) endet, -oder- kein '.' Enthält. (Punkt-) Zeichen.
  3. Verwenden Sie den vollständigen Pfadteil der URI und fügen Sie einen Schrägstrich hinzu.
  4. Senden Sie eine (permanente) HTTP 301-Umleitung, um den Browser auf diesen neuen URI zu leiten.

Dies führt zu den folgenden Testfällen

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

Ich denke, die Regel hat den Zweck, Ressourcen, die keine Datei zu sein scheinen, Schrägstriche hinzuzufügen, aber einen Randfall zu haben.

Wenn Sie einer Ressource nicht mit '.' Einen Schrägstrich hinzufügen. (Punkt-) Zeichen im Nicht-Datei-Teil des Pfads, in den der reguläre Ausdruck geändert werden soll:

# 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
quelle
!(\/$|\.[^\/]*)- Ihre aktualisierte Regex ist wirklich nicht anders. Sie benötigen auch einen Anker am Ende der Schnur im 2. Teil (der zur Erweiterung passt). Vielleicht so etwas wie: !(/|\.[a-zA-Z]+)$(keine Notwendigkeit, den Schrägstrichen zu entkommen).
MrWhite
@ MrWhite Guter Fang! Ich habe meine Antwort aktualisiert!
Joffrey