RewriteRule için "^ // (. *)" (Çift eğik çizgiyle başlar) neden tek bir eğik çizgiye yönlendirmiyor?

Aug 17 2020

Bu yeniden yazma kuralını vHost bağlamında yapın. Ancak //.*(çift eğik çizgi) ile başlayan istekleri yeniden yazmaz . /.*Şuna bir yönlendirme ile yanıt vermek yerine onları (tek eğik çizgi)/.*

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

Bu neden çalışmıyor?

Yanıtlar

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

Bu asla eşleşmeyecektir çünkü RewriteRule kalıbın eşleştiği URL-yolu , birden çok eğik çizginin tüm örneklerini tek bir eğik çizgiye indirgemiştir.

Bu tür istekleri yeniden yönlendirmek için, bu "özelliği" kullanabilir ve "kendisine" yeniden yönlendirebilir ve THE_REQUESTbunun yerine, ilk istekte birden çok eğik çizgi olup olmadığını belirlemek için sunucu değişkenini kontrol edebilirsiniz. THE_REQUESTistek başlığının ilk satırıdır ve istemciden gönderilen işlenmemiş ham istek URL'sini (protokol ve ana bilgisayar adı hariç, ancak sorgu dizesi dahil) içerir.

Örneğin, birden çok eğik çizginin tüm örneklerini URL yolu boyunca tek bir eğik çizgiye yeniden yönlendirmek için, yalnızca başlangıçta değil, bunun gibi bir şey yapabilirsiniz:

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

Normal ifade, URL'nin sorgu dizesi bölümünde \s[^?]*//birden fazla eğik çizgiyle eşleşmememizi sağlar (aksi takdirde yeniden yönlendirme döngüsüyle sonuçlanır).


RewriteCond %{THE_REQUEST} ^//Yeniden yazma kuralını yalnızca çift eğik çizgi ile başlayanlara, diğer tüm çift eğik çizgi örneklerini göz ardı ederek uygulamamıza izin verir mi ?

Tam olarak değil, THE_REQUESTsunucu değişkeni aslında HTTP istek başlığının ilk satırının tamamını içerir. Başka bir deyişle, formun bir dizisi:

GET /foo/bar.html HTTP/1.1

Veya GET //foo/bar.html HTTP/1.1URL yolunun başında çift eğik çizgi varsa, bunun yerine bunun gibi bir şeye ihtiyacınız olacaktır:

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

... tüm istek yöntemlerini yakalamak için. Ve özellikle sadece URL yolunun başlangıcında sadece çift eğik çizgi, üçlü eğik çizgi vb.

\s//[^/]- Bu, bir boşluk ( istek yönteminden sonra ) ve ardından 2 eğik çizgi ve bölü çizgisi dışında bir şey (yani , belge kökü için bir boşluk veya başka bir URL yolu).