Çift eğik çizgi URL'lerde ne anlama geliyor?


32

İkili eğik çizgi genellikle URL’lerde tam olarak ne anlama gelir?

Örneğin:

  • http://www.example.com/A/B//C/

Lütfen hemen sonra baştan bahsetmediğimi unutmayın http:.

Yanıtlar:


32

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.


11
Aslında, sayfanın yüklediği tarayıcı ile ilgisi yoktur , ancak sunucu fazladan eğik çizgiyi yok sayar. Bu uzun sürdü, gönderdiğim cevabı gör .
josh3736,

33

@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.cssve 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 Permanentlyherhangi bir çift eğik çizginin URL'den çıkarılmasını sağlamak için bir HTTP yönlendirmesi verecektir .


2
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)
Ward MUYLAERT

+1 - Ekstra bilgi için teşekkürler. Ben böyle düşünmedim!
Ben Hoffman,

3
Yanlış davranış değildir : a/bve a//baslı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.
Ilmari Karonen

4
@IlmariKaronen: Kesinlikle yanlış bir davranış çünkü (1) bu davranış otomatik olarak tek bir kaynağa sonsuz sayıda potansiyel yinelenen referans oluşturur (bu, herhangi bir özelliğin mektubu ihlal edilmediğinde kesinlikle ruhu ihlal eder) ve daha pratiktir. (2) Boş dizeyi a//bdizin olarak uygun şekilde sayan tarayıcılarda göreceli yol işlemeyi "keser" (yukarıdaki stil sayfası örneğine bakın).
josh3736

1
... ve neyse, RFC 2396 olduğunu iddia ediyorum yapar Spec her bölü önemli olduğunu söylüyor çünkü otomatik çöken eğik çizgiler ile aynı kaynağı dönen bir sunucu korusun. Ardışık eğik çizgileri otomatik olarak görmezden gelmek, bu belirtimi ihlal ediyor. (Biri sunucularını bunu yapmak için programladıysa, bunu yapmak aptalca olsa bile bir şey var. Ancak bunu varsayılan olarak yapan sunucular yanlış.)
josh3736

4

Ç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.htmbir anlamı yoktur.


peki, bu gerçek değil. Biri karışık içerik probleminden kaçınmak gerektiğinde çift eğimlidir, bu nedenle site http'den yüklendiğinde, çift katlılar http'e genişler, site https'den yüklendiğinde çift katlılar https'ye genişletilir.
andrej

2

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.