Apa arti slash ganda dalam URL?

32

Apa arti garis miring ganda yang sering ditemukan di URL?

Sebagai contoh:

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

Harap dicatat bahwa saya tidak merujuk ke awal setelahnya http:.

aneuryzm
sumber

Jawaban:

32

Itu adalah kesalahan dalam kode programmer / pengembang. Jika Anda membandingkan dua URL ini:

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

Mereka terlihat berbeda tetapi jika Anda mengunjungi keduanya, keduanya akan berfungsi di sebagian besar browser modern.

Ini adalah sesuatu yang ingin Anda perbaiki. Jika Anda memiliki garis miring ganda, ini dapat membingungkan perayap web Google dan membuat mereka berpikir ada 2 versi halaman.

Ben Hoffman
sumber
11
Sebenarnya, bahwa memuat halaman tidak ada hubungannya dengan browser , tetapi server mengabaikan pemotongan tambahan. Ini sudah lama, jadi lihat jawaban yang saya posting.
josh3736
33

Seperti yang disebutkan oleh @RandomBen , double slash kemungkinan besar merupakan hasil kesalahan di suatu tempat.

Bahwa halaman dimuat tidak ada hubungannya dengan browser , tetapi server mengabaikan pemotongan tambahan. Peramban tidak melakukan sesuatu yang istimewa dengan garis miring tambahan di URL, hanya mengirimkannya dalam permintaan:

GET /A/B//C/D HTTP/1.1
Host: www.example.com
...

Sepertinya versi Apache dan IIS saat ini akan mengabaikan garis miring tambahan saat menyelesaikan jalur dan mengembalikan dokumen yang akan dikembalikan seandainya URL tidak memiliki garis miring tambahan. Namun , browser (saya menguji IE 8 dan Chrome 9) menjadi bingung oleh URL relatif (mengandung komponen jalur induk) dari sumber daya di halaman, yang menghasilkan hasil yang buruk. Misalnya, jika suatu halaman memiliki:

<link rel="stylesheet" href="../../style.css" type="text/css" />

Setelah memuat halaman /a/b/c/, browser akan meminta /a/style.css. Tetapi jika — untuk alasan apa pun — /a/b//c/diminta (dan server mengabaikan slash tambahan), browser akan berakhir meminta /a/b/style.css, yang tidak akan ada. Ups, halamannya terlihat jelek.

(Ini jelas tidak akan terjadi jika URL tidak memiliki komponen jalur induk ( ..) atau absolut.)

Ini adalah pendapat saya bahwa Apache dan IIS (dan mungkin orang lain) bertindak secara tidak benar sebagai /a/b/c/dan /a/b//c/teknis mewakili dua sumber yang berbeda. Menurut RFC 2396 , setiap tebasan signifikan:

  path          = [ abs_path | opaque_part ]

  path_segments = segment *( "/" segment )
  segment       = *pchar *( ";" param )
  param         = *pchar

  pchar         = unreserved | escaped |
                  ":" | "@" | "&" | "=" | "+" | "$" | ","

Jadi, /a/b/c/terdiri dari tiga segmen: "a", "b", dan "c"; /a/b//c/sebenarnya terdiri dari empat: "a", "b", "" (string kosong), dan "c". Apakah string kosong adalah direktori sistem file yang valid atau tidak, adalah detail dari platform server. (Dan secara logis, ini berarti browser benar-benar beroperasi dengan benar ketika mem-parsing URL relatif dengan komponen jalur induk - dalam contoh saya, mereka naik melewati direktori "c" dan direktori "", meninggalkan kami untuk memintastyle.css dari "b".)

Jika Anda menggunakan Apache mod_rewrite, ada perbaikan yang cukup sederhana :

# remove multiple slashes anywhere in url 
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ 
RewriteRule . %1/%2 [R=301,L] 

Ini akan mengeluarkan 301 Moved Permanentlypengalihan HTTP sehingga setiap garis miring ganda dikeluarkan dari URL.

josh3736
sumber
2
Bukankah lebih baik jika mod_rewritesolusi Anda memperhitungkan 3, 4, ... garis miring juga? Sesuatu seperti itu /{2,}? (Dengan asumsi Apache memungkinkan kuantifier semacam itu, saya tidak terlalu terbiasa dengannya)
Ward Muylaert
+1 - Terima kasih atas info tambahannya. Saya tidak berpikir seperti itu!
Ben Hoffman
3
Ini bukan perilaku yang salah : a/bdan a//bmemang ada dua jalur URL yang berbeda, tetapi tidak ada yang melarang server mengembalikan sumber daya yang sama untuk keduanya jika diinginkan. Namun saya setuju dengan Anda, bahwa dalam praktiknya mengembalikan pengalihan 301 akan tampak lebih bermanfaat.
Ilmari Karonen
4
@IlmariKaronen: Ini benar -benar perilaku yang salah karena (1) perilaku ini secara otomatis membuat jumlah rangkap duplikat potensial tak terhingga untuk satu sumber daya (yang, jika tidak melanggar surat spesifikasi apa pun, tentu saja melanggar semangat), dan lebih praktis (2) itu "istirahat" penanganan relatif-path di browser yang benar menghitung string kosong a//bsebagai direktori (lihat contoh stylesheet di atas).
josh3736
1
... dan lagi pula, aku berpendapat bahwa RFC 2396 tidak melarang server dari kembali sumber daya yang sama dengan garis miring auto-runtuh karena spec mengatakan setiap garis miring adalah signifikan. Secara otomatis mengabaikan tebasan berurutan melanggar spesifikasi itu. (Adalah satu hal jika seseorang memprogram server mereka untuk melakukan itu, bahkan jika melakukan itu akan konyol. Namun, server yang melakukan ini secara default tidak benar.)
josh3736
4

Double slash memiliki arti ketika digunakan dalam URL sumber daya. Misalnya, ketika pengguna di CSS untuk URL gambar latar belakang:

.classname {
    background : url("//example.com/a/b/c/d.png");
}

Ini artinya gambar latar belakang ini diambil dari domain lain selain dari domain halaman web ini. Atau dengan kata lain, http://bisa ditulis sebagai adil// ketika menggunakannya di URL sumber daya.

Tapi garis miring ganda di antara URL (mis . /a//b/c/d.htm:) tidak memiliki arti.

Alan Joseph
sumber
yah, ini tidak sepenuhnya benar. Double slash dikeluarkan ketika seseorang perlu menghindari masalah konten campuran, jadi ketika situs dimuat dari http, doubleslash akan diperluas ke http, ketika situs dimuat dari https, doubleslash diperluas ke https.
andrej
2

Seperti disebutkan, beberapa server diatur untuk mengabaikan garis miring ganda di jalur URL, tetapi hosting statis S3 Amazon tidak. Jika Anda ingin menangani / mengabaikannya dalam hal itu, Anda bisa menggunakan Aturan Pengalihan di panel properti.

Jika Anda ingin mengabaikan garis miring ganda mengikuti nama domain maka Anda dapat menggunakan sesuatu seperti ini:

<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals>/</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <ReplaceKeyPrefixWith/>
    </Redirect>
  </RoutingRule>
</RoutingRules>

Anda mungkin juga dapat menemukan dan menggantinya sepanjang, tetapi itu sudah cukup bagi saya.

orlade
sumber