Jawaban:
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.
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 Permanently
pengalihan HTTP sehingga setiap garis miring ganda dikeluarkan dari URL.
mod_rewrite
solusi Anda memperhitungkan 3, 4, ... garis miring juga? Sesuatu seperti itu /{2,}
? (Dengan asumsi Apache memungkinkan kuantifier semacam itu, saya tidak terlalu terbiasa dengannya)
a/b
dan a//b
memang 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.
a//b
sebagai direktori (lihat contoh stylesheet di atas).
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.
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.