Perché RewriteRule per "^//(.*)" (inizia con una doppia barra) non reindirizza a una singola barra?

Aug 17 2020

Avere questa regola di riscrittura nel contesto vHost. Ma non riscrive le richieste che iniziano con //.*(doppia barra). Li serve solo da /.*(singola barra) invece di rispondere con un reindirizzamento a/.*

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

Perché non funziona?

Risposte

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

Questo non corrisponderà mai perché il percorso URL con cui il RewriteRule pattern corrisponde ha già avuto tutte le istanze di più barre ridotte a una singola barra.

Per reindirizzare tali richieste è possibile utilizzare questa "funzione" e reindirizzare semplicemente "a se stesso" e controllare THE_REQUESTinvece la variabile del server per determinare se erano presenti più barre nella richiesta iniziale. THE_REQUESTè la prima riga dell'intestazione della richiesta e contiene l'URL della richiesta non elaborato (esclusi il protocollo e il nome host, ma inclusa la stringa della query) inviato dal client.

Ad esempio, per reindirizzare tutte le istanze di più barre a una singola barra in tutto il percorso dell'URL, non solo all'inizio, puoi fare qualcosa del genere:

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

La regex \s[^?]*//garantisce che non corrispondano più barre nella parte della stringa di query dell'URL (che altrimenti risulterebbe in un ciclo di reindirizzamento).


Ci RewriteCond %{THE_REQUEST} ^//consentirebbe di applicare la regola di riscrittura solo a quelli che iniziano con le doppie barre, ignorando tutte le altre istanze di doppie barre?

Non proprio, THE_REQUESTla variabile del server contiene effettivamente l'intera prima riga dell'intestazione della richiesta HTTP. In altre parole, una stringa della forma:

GET /foo/bar.html HTTP/1.1

O GET //foo/bar.html HTTP/1.1se c'è una doppia barra all'inizio del percorso URL, quindi avresti bisogno di qualcosa di simile a questo:

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

...per intercettare tutti i metodi di richiesta. E in particolare solo una doppia barra, non triple barre, ecc. Solo all'inizio del percorso URL.

\s//[^/]- Questo è uno spazio (dopo il metodo di richiesta ) seguito da 2 barre e qualcosa di diverso da una barra (ad esempio uno spazio per la radice del documento o qualche altro percorso URL).