มีข้อเสียสำหรับการใช้ double slash ชั้นนำเพื่อสืบทอดโปรโตคอลใน URL หรือไม่? ie src =“ // domain.com”


148

ฉันมีสไตล์ชีทที่โหลดรูปภาพจากโดเมนภายนอกและฉันต้องการให้โหลดจาก https: // จากหน้าคำสั่งซื้อที่ปลอดภัยและ http: // จากหน้าอื่น ๆ โดยอ้างอิงจาก URL ปัจจุบัน ฉันพบว่าการเริ่มต้น URL ด้วยเครื่องหมายสแลชคู่สืบทอดโปรโตคอลปัจจุบัน เบราว์เซอร์ทั้งหมดสนับสนุนเทคนิคนี้หรือไม่?

เช่น HTML:

<img src="//cdn.domain.com/logo.png" />

css เช่น:

.class { background: url(//cdn.domain.com/logo.png); }

1
สิ่งนี้ทำให้ไซต์ช้าลงหรือไม่ ???
TheBlackBenzKid

2
ไม่มีเหตุผลใดที่สิ่งนี้จะมีผลกระทบต่อประสิทธิภาพการทำงานยกเว้นในกรณีที่ Meder ระบุไว้ด้านล่างในคำตอบของเธอ
Rob Volk

ดูเหมือนว่าฉันจะทำอะไรบางอย่าง ไม่กี่เดือนที่ผ่านมานักพัฒนา Google เริ่มใช้การประชุมนี้ใน Javascript ห้องสมุดหน้าของพวกเขาเป็นเจ้าภาพdevelopers.google.com/speed/libraries/devguide
ร็อบ Volk

10
จะเกิดอะไรขึ้นถ้าไฟล์ HTML ดังกล่าวโหลดในเครื่อง (เปิดโดยตรงกับเบราว์เซอร์) ดูเหมือนว่า Firefox (28 ในกรณีนี้) จากนั้นไม่โหลดทรัพยากรระยะไกล เหมาะสมแล้วเนื่องจาก HTTP ไม่ใช่โพรโทคอลหลัก แต่นั่นจะเป็นข้อเสียในความคิดของฉัน
ดร. Jan-Philip Gehrcke

คำตอบ:


86

หากเบราว์เซอร์รองรับRFC 1808 ส่วนที่ 4 , RFC 2396 ส่วน 5.2หรือRFC 3986 มาตรา 5.2ดังนั้นเบราว์เซอร์จะใช้รูปแบบของ URL ของหน้าสำหรับการอ้างอิงที่ขึ้นต้นด้วย "//"


8
รองรับเบราว์เซอร์หลักทั้งหมดนี้หรือไม่ (IE7, IE8, FF, Chrome, Safari)
Rob Volk

22
เมื่อพิจารณาว่า RFC ตัวแรกที่ใช้อธิบาย RFC 1808 นั้นเขียนขึ้นเมื่อ 15 ปีที่แล้วและการอ้างอิง URL เป็นกุญแจสำคัญในการทำงานของเว็บไซต์ฉันคิดว่ามันปลอดภัยที่จะพูดว่าเบราว์เซอร์หลัก ๆ เกือบทั้งหมดรองรับในตอนนี้ แต่วิธีเดียวที่จะรู้แน่ก็คือลองด้วยตัวเองและดูว่าเกิดอะไรขึ้น
Remy Lebeau

2
คำถามนี้เชื่อมโยงจากคนที่ถามคำถามที่คล้ายกันและฉันพบว่าใน RFC 1630 ปีก่อน (ระบุไว้แตกต่างกัน แต่ยังคงอนุญาตรูปแบบที่เป็นปัญหา) มันอาจจะอยู่ในรูปแบบเดียวหรือเอกสารอื่น ๆ ที่เคยftp://info.cern.ch/pub/www/doc/http-spec.txtเริ่มเมื่อปี 1991 ใคร ๆ ก็ควรมีสำเนาที่เก็บถาวร
Jon Hanna

4
"2014.12.17: ตอนนี้ SSL ได้รับการสนับสนุนสำหรับทุกคนและไม่มีปัญหาด้านประสิทธิภาพตอนนี้เทคนิคนี้เป็นรูปแบบการต่อต้านหากสินทรัพย์ที่คุณต้องการมีอยู่ใน SSL ให้ใช้ https: // asset เสมอ" (ราคาที่ยกมาจากstackoverflow.com/a/27999789 )
joonas.fi

@ joonas.fi การใช้เหตุผลนั้นเป็นเรื่องที่ซับซ้อนมาก SSL ยังคงมีผลกระทบต่อประสิทธิภาพและไม่จำเป็นในแอปพลิเคชันจำนวนมาก ฉันชอบที่จะใช้มันแน่นอน แต่ฉันไม่ต้องการให้มีการบังคับใช้เช่นรหัสที่ฉันปรับใช้
Otheus

64

เมื่อใช้กับlinkหรือ@importIE7 / IE8 จะดาวน์โหลดไฟล์สองครั้งต่อhttp://paulirish.com/2010/the-protocol-relative-url/

อัปเดตจาก 2014:

ตอนนี้ที่ SSL จะเป็นกำลังใจให้สำหรับทุกคนและไม่ได้มีความกังวลเกี่ยวกับผลการดำเนินงาน , เทคนิคนี้ในขณะนี้คือการต่อต้านรูปแบบ หากเนื้อหาที่คุณต้องการมีอยู่ใน SSL ให้ใช้เนื้อหานั้นเสมอhttps://


18
แก้ไขใน IE9, FWIW
EricLaw

@EricLaw นั้นได้รับการแก้ไขใน IE9 โดยไม่คำนึงถึงโหมดการเรนเดอร์หรือเฉพาะในโหมดมาตรฐานและยังขาดในโหมด Quirks?
scunliffe

ฉันเกือบจะแน่ใจว่าสิ่งนี้ได้รับการแก้ไขในทุกโหมดในเครื่องสแกน lookahead คุณเคยเห็นที่อื่นบ้างไหม?
EricLaw

SSL แน่นอนไม่ได้มีผลกระทบประสิทธิภาพการทำงาน EFF ไม่ได้เขียนอินเทอร์เฟซเซิร์ฟเวอร์ - เซิร์ฟเวอร์และไซต์อื่น ๆ นั้นมีผู้เชี่ยวชาญด้านเทคนิคเพียงเล็กน้อย นอกจากนี้มันเป็นรูปแบบต่อต้านที่จะสมมติว่าผู้ขายของเว็บไซต์จะบังคับใช้ข้อ จำกัด ดังกล่าว ดังนั้นคนเขียนแอปพลิเคชัน CSS และ javascript ไม่ควรฝากคำถามไว้กับโพรโทคอล
Otheus

63

ข้อเสียประการหนึ่งเกิดขึ้นหาก URL ของคุณถูกดูนอกบริบทของหน้าเว็บ ตัวอย่างเช่นข้อความอีเมลที่อยู่ในไคลเอนต์อีเมล (พูด Outlook) ไม่มี URL อย่างมีประสิทธิภาพและเมื่อคุณกำลังดูข้อความที่มี URL ที่เกี่ยวข้องกับโปรโตคอลจะไม่มีบริบทโปรโตคอลที่ชัดเจนเลย (ข้อความนั้นเป็นอิสระ ของโปรโตคอลที่ใช้ในการดึงข้อมูลไม่ว่าจะเป็น POP3, IMAP, Exchange, uucp หรืออะไรก็ตาม) ดังนั้น URL จึงไม่มีโปรโตคอลที่เกี่ยวข้อง ฉันไม่ได้ตรวจสอบความเข้ากันได้กับไคลเอนต์อีเมลเพื่อดูสิ่งที่พวกเขาทำเมื่อพบกับตัวจัดการโปรโตคอลที่ขาดหายไป - ฉันเดาว่าส่วนใหญ่จะเดาที่ http Apple Mail ปฏิเสธที่จะให้คุณป้อน URL โดยไม่มีโปรโตคอล คล้ายกับวิธีที่ URL สัมพัทธ์ไม่ทำงานในอีเมลเนื่องจากบริบทที่ขาดหายไปในทำนองเดียวกัน

ปัญหาที่คล้ายกันอาจเกิดขึ้นในบริบทที่ไม่ใช่ HTTP อื่น ๆ เช่นในทวีตข้อความ SMS เอกสาร Word ฯลฯ

คำอธิบายทั่วไปคือ URL โปรโตคอลที่ไม่ระบุชื่อไม่สามารถทำงานแยกได้ มีต้องเป็นบริบทที่เกี่ยวข้อง ในหน้าเว็บทั่วไปมันก็ดีที่จะดึงไลบรารีสคริปต์ด้วยวิธีนั้น แต่ลิงก์ภายนอกใด ๆ ควรระบุโปรโตคอลเสมอ ฉันได้ลองทดสอบง่ายๆ: //stackoverflow.comแมปกับfile:///stackoverflow.comเบราว์เซอร์ทั้งหมดที่ฉันพยายามมันในเพื่อให้พวกเขาจริงๆจะไม่ได้ทำงานด้วยตัวเอง


5
นี่เป็นจุดที่ดีจริงๆฉันคิดเรื่องนี้จริง ๆ เพราะฉันหลับไปเมื่อคืนนี้ ปัญหาอีกประการหนึ่งคืออาจไม่มีรุ่นhttpsหรือhttpรุ่นจริงคุณไม่สามารถคาดเดาได้เสมอ
Wesley Murch

1
นอกเบราว์เซอร์คุณต้องพูดเอง ไม่มีการพูดว่าอีเมลหรือไคลเอนต์อื่นรู้เกี่ยวกับ javascript หรือ css เป็นต้นดังนั้นนี่คือจุดที่สงสัยเกี่ยวกับ URL สัมพัทธ์
chris

ไม่ใช่จุดที่สงสัย ลูกค้าอีเมลหลายสนับสนุน JS file://และเบราว์เซอร์สามารถอย่างแน่นอนเมื่อโหลดจาก มันคือการใช้งานเล็กน้อย แต่เมื่อมันมาถึงมันเป็นสิ่งสำคัญ
Jun-Dai Bates-Kobashigawa

ผมไม่ต้องการมีวิธีการที่จะระบุการใช้งาน http เว้นแต่ URL ปัจจุบันเป็น https ซึ่งในกรณีนี้ใช้ httpsมากกว่าการระบุการใช้โปรโตคอลเดียวกับที่หน้าปัจจุบันเต็มไปด้วยซึ่งมีประสิทธิภาพในสิ่งที่//เป็น
Jun-Dai Bates-Kobashigawa

2
หากคุณระบุเช่น<base href="https://www.google.com">คุณสามารถดูเนื้อหาภายนอกเว็บ อย่างใดอย่างหนึ่ง<img src="//www.google.com/images/srpr/logo11w.png">หรือ<img src="images/srpr/logo11w.png">
zig

3

เหตุผลอาจเป็นไปได้ที่จะให้หน้าเว็บแบบพกพา หากหน้านอกไม่ได้รับการเข้ารหัส (http) ทำไมสคริปต์ที่เชื่อมโยงควรถูกเข้ารหัส นี่น่าจะเป็นการสูญเสียประสิทธิภาพที่ไม่จำเป็น ในกรณีหน้านอกถูกเข้ารหัสอย่างปลอดภัย (https) ดังนั้นเนื้อหาที่เชื่อมโยงควรได้รับการเข้ารหัสเช่นกัน หากหน้านั้นถูกเข้ารหัสเนื้อหาที่เชื่อมโยงไม่ใช่ IE ดูเหมือนว่าจะออกคำเตือนเนื้อหาแบบผสม เหตุผลก็คือผู้โจมตีสามารถจัดทำสคริปต์ระหว่างทางได้ ดูhttp://ie.microsoft.com/testdrive/Browser/MixedContent/Default.html?o=1สำหรับการสนทนาที่ยาวนานขึ้น

HTTPS ทุกแคมเปญจากเอฟเอฟแนะนำให้ใช้ https เมื่อใดก็ตามที่เป็นไปได้ วันนี้เรามีความสามารถของเซิร์ฟเวอร์เพื่อให้บริการหน้าเว็บที่เข้ารหัสเสมอ


0

เพียงเพื่อความสมบูรณ์ สิ่งนี้ถูกกล่าวถึงในเธรดอื่น:

"สองฟอร์เวิร์ดสแลช" เป็นชวเลขทั่วไปสำหรับ "สิ่งที่โปรโตคอลกำลังใช้อยู่ตอนนี้"

if (plain http environment) {
    use 'http://example.com/my-resource.js'
} else {
    use 'https://example.com/my-resource.js'
}

กรุณาตรวจสอบด้ายเต็ม


-2

ดูเหมือนจะเป็นเทคนิคที่ใช้กันทั่วไปในตอนนี้ ไม่มีข้อเสียมันช่วยรวมโปรโตคอลสำหรับสินทรัพย์ทั้งหมดในหน้าดังนั้นควรใช้ทุกที่ที่เป็นไปได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.