Non riesco a capire una regola htaccess


9

Ho questo nel mio htaccess ma non riesco a capire a cosa serva. A causa della natura della regola, la ricerca non aiuta neanche.

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

Qualcuno può spiegare a cosa serve?


Se la parte della richiesta (la parte dell'URL dopo ".com") non termina con a /e non contiene un " .", reindirizza la richiesta aggiungendola con a /. L'intenzione probabile di questa regola è gestire l'indicizzazione automatica delle directory.
Peter - Ripristina Monica il

Risposte:


11

Tutto questa regola non fa altro che aggiungere un trailing /per gli URL, se non c'è nessuno, e se non v'è .l'URI, così https://example.org/testsarete reindirizzati ad https://example.org/test/, ma https://example.org/test.htmlnon sarà riscritto per https://example.org/test.html/(ma nota: https://example.org/test.case/foldersaranno anche non essere reindirizzato a https://example.org/test.case/folder/quanto contiene una .nella 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]

" /test.case/folderInoltre non verrà reindirizzato" - Punto minore, ma se "cartella" è una directory del filesystem, allora mod_dir emetterà (di default) un reindirizzamento 301 per aggiungere una barra finale. È solo un problema se è /test.case/some-other-virtual-urlche dovrebbe avere una barra finale.
Mr White

6

Senza convalida, ma utilizzando la mia esperienza nella riscrittura di Apache, questa configurazione sembra:

  1. Corrisponde alla parte "percorso" dell'URI (non al server, alla porta o ai parametri della query), ad esempio "/my/location/file.html".
  2. Corrisponde se questa parte non termina con un carattere '/' (barra), -oppure non include un '.' carattere (punto).
  3. Utilizzare la parte del percorso completo dell'URI e aggiungere una barra.
  4. Invia un reindirizzamento HTTP 301 (permanente) per indirizzare il browser a questo nuovo URI.

Ciò comporterà i seguenti casi di test

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

Quindi penso che la regola abbia lo scopo di aggiungere barre alle risorse che non sembrano essere un file, ma sembrano avere un caso limite.

In caso contrario, aggiungere una barra a una risorsa con '.' (punto) carattere nella parte non file del percorso in cui l'espressione regolare deve essere modificata in:

# 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]

!(\/$|\.[^\/]*)- Il tuo regex aggiornato non è davvero diverso. È necessaria anche un'ancora di fine stringa nella seconda parte (che corrisponde all'estensione). Forse qualcosa del tipo: !(/|\.[a-zA-Z]+)$(non c'è bisogno di sfuggire alle barre).
MrWhite,

@MrWhite Buona cattura! Ho aggiornato la mia risposta!
Joffrey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.