Yanıtlar:
Bu, programcıların / geliştiricilerin kodunda bir hatadır. Bu iki URL’yi karşılaştırırsanız:
http://www.example.com/A/B/C/
http://www.example.com/A/B//C/
Farklı görünüyorlar ancak ikisini de ziyaret ederseniz, ikisi de çoğu modern tarayıcıda çalışır.
Bu düzeltmek istediğiniz bir şey. Çift eğik çizginiz varsa, Google’ın web tarayıcılarını şaşırtabilir ve sayfanın 2 sürümü olduğunu düşünmelerini sağlayabilir.
@RandomBen tarafından belirtildiği gibi , çift eğik çizgi büyük olasılıkla bir yerdeki bir hatanın sonucudur.
Sayfanın yüklediğinden tarayıcı ile hiçbir ilgisi yoktur , ancak sunucu fazladan eğik çizgiyi yok sayar. Tarayıcı, URL’de fazladan eğik çizgiler bulunan özel bir şey yapmaz, yalnızca istek üzerine gönderir:
GET /A/B//C/D HTTP/1.1
Host: www.example.com
...
Görünüşe göre Apache ve IIS'nin her ikisi de yolu çözerken fazladan eğik çizgileri yok sayar ve URL'nin fazladan eğik çizgileri olmasaydı döndürülen belgeyi döndürür. Bununla birlikte , tarayıcılar (IE 8 ve Chrome 9'u test ettim), sayfadaki kaynakların göreceli URL'leri (ana yol bileşenlerini içeren) ile kötü sonuçlar veren kafa karışıklığı yaratır. Örneğin, bir sayfa varsa:
<link rel="stylesheet" href="../../style.css" type="text/css" />
Sayfa yüklendikten sonra /a/b/c/
, tarayıcı talep edecektir /a/style.css
. Ancak - ne /a/b//c/
nedenle olursa olsun - talep edilirse (ve sunucu fazladan eğik çizgiyi yoksayarsa), tarayıcı isteği olmayacak /a/b/style.css
ve bu gerçekleşmeyecektir. Hata! Sayfa çok çirkin görünüyor.
(URL, bir ana yol bileşenine ( ..
) sahip değilse veya mutlaksa, bu açıkça görünmeyecektir .)
Benim fikrime göre Apache ve IIS (ve muhtemelen diğerleri) yanlış davranıyorlar /a/b/c/
ve /a/b//c/
teknik olarak iki farklı kaynağı temsil ediyorlar . RFC 2396'ya göre , her eğik çizgi önemlidir:
path = [ abs_path | opaque_part ]
path_segments = segment *( "/" segment )
segment = *pchar *( ";" param )
param = *pchar
pchar = unreserved | escaped |
":" | "@" | "&" | "=" | "+" | "$" | ","
Yani, /a/b/c/
üç bölümden oluşur: "a", "b" ve "c"; /a/b//c/
aslında dört oluşur: "a", "b", "" (boş dize) ve "c". Boş dizenin geçerli bir dosya sistemi dizini olup olmadığı, sunucunun platformunun bir detayıdır. (Mantıksal olarak, bu, tarayıcıların göreli URL'leri üst yol bileşenleriyle ayrıştırırken tarayıcıların gerçekten doğru çalıştığı anlamına gelir - benim örneğimde, "c" dizini ve "" dizinini geçerek bizi style.css
"b" den istememizi sağlar.)
Apache kullanıyorsanız mod_rewrite
, oldukça basit bir düzeltme var :
# remove multiple slashes anywhere in url
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
Bu, 301 Moved Permanently
herhangi bir çift eğik çizginin URL'den çıkarılmasını sağlamak için bir HTTP yönlendirmesi verecektir .
mod_rewrite
Çözümünüzü 3, 4, ... eğik çizgi olarak da dikkate almak daha iyi olmaz mıydı ? Çizgileri boyunca bir şey /{2,}
? (Apache varsayarsak onunla çok aşina değilim nicelik bu tür sağlar)
a/b
ve a//b
aslında iki ayrı URL yolu vardır, ancak hiçbir şey sunucunun isterse ikisi için de aynı kaynağı döndürmesini yasaklamaz. Bununla birlikte, pratikte bir 301 yönlendirmesini döndürmenin daha yararlı olacağına katılıyorum.
a//b
dizin olarak uygun şekilde sayan tarayıcılarda göreceli yol işlemeyi "keser" (yukarıdaki stil sayfası örneğine bakın).
Çift eğik çizginin kaynak URL'lerinde kullanıldığında bir anlamı vardır. Örneğin, arka plan resminin URL’si için CSS’de kullanıcı olduğunda:
.classname {
background : url("//example.com/a/b/c/d.png");
}
Burada, bu arka plan resminin, mevcut web sayfasının etki alanı dışındaki farklı bir etki alanından alındığı anlamına gelir. Veya başka bir deyişle, kaynak URL’lerde kullanıldığında olduğu http://
gibi yazılabilir //
.
Ancak, URL’lerin (örneğin:) arasındaki bu çift çatışmanın /a//b/c/d.htm
bir anlamı yoktur.
Belirtildiği gibi, bazı sunucular URL yolunda iki eğik çizgiyi yoksaymak üzere ayarlanmıştır, ancak Amazon S3 statik barındırma işlemi yapılmayacaktır. Bu durumda bunları işlemek / yoksaymak istiyorsanız , özellikler panelinde Yeniden Yönlendirme Kurallarını kullanabilirsiniz .
Etki alanı adını izleyen çift eğik çizgiyi yoksaymak istiyorsanız, bunun gibi bir şey kullanabilirsiniz:
<RoutingRules>
<RoutingRule>
<Condition>
<KeyPrefixEquals>/</KeyPrefixEquals>
</Condition>
<Redirect>
<ReplaceKeyPrefixWith/>
</Redirect>
</RoutingRule>
</RoutingRules>
Muhtemelen bunları baştan sona bulabilir ve değiştirebilirsiniz, ancak bu benim için yeterliydi.