เครื่องหมายทับสองครั้งที่พบบ่อยใน URL หมายถึงอะไร
ตัวอย่างเช่น:
http://www.example.com/A/B//C/
http:
โปรดทราบว่าผมไม่ได้หมายถึงการเริ่มต้นหลังจากที่เหมาะสม
เครื่องหมายทับสองครั้งที่พบบ่อยใน URL หมายถึงอะไร
ตัวอย่างเช่น:
http://www.example.com/A/B//C/
http:
โปรดทราบว่าผมไม่ได้หมายถึงการเริ่มต้นหลังจากที่เหมาะสม
คำตอบ:
นั่นเป็นข้อผิดพลาดในรหัส 'โปรแกรมเมอร์ /' นักพัฒนา หากคุณเปรียบเทียบ URL ทั้งสองนี้:
http://www.example.com/A/B/C/
http://www.example.com/A/B//C/
พวกเขาดูแตกต่างกัน แต่ถ้าคุณไปเยี่ยมทั้งคู่ทั้งสองจะทำงานในเบราว์เซอร์ที่ทันสมัยที่สุด
นี่คือสิ่งที่คุณต้องการแก้ไข หากคุณมีเครื่องหมายทับสองด้านอาจทำให้ซอฟต์แวร์รวบรวมข้อมูลเว็บของ Google สับสนและทำให้พวกเขาคิดว่ามีหน้าเว็บ 2 เวอร์ชัน
ตามที่@RandomBenพูดถึงเครื่องหมายทับสองครั้งน่าจะเป็นผลมาจากข้อผิดพลาดบางแห่ง
การโหลดหน้าเว็บนั้นไม่มีส่วนเกี่ยวข้องกับเบราว์เซอร์แต่เป็นการที่เซิร์ฟเวอร์จะไม่สนใจเครื่องหมายทับเพิ่มเติม เบราว์เซอร์ไม่ได้ทำอะไรเป็นพิเศษโดยมีเครื่องหมายทับเป็นพิเศษใน URL เพียงส่งไปตามคำขอ:
GET /A/B//C/D HTTP/1.1
Host: www.example.com
...
ดูเหมือนว่าเวอร์ชันปัจจุบันของ Apache และ IIS ทั้งคู่จะละเว้นเครื่องหมายสแลชพิเศษขณะที่แก้ไขพา ธ และส่งคืนเอกสารที่จะถูกส่งคืนหาก URL นั้นไม่มีสแลชพิเศษ อย่างไรก็ตามเบราว์เซอร์ (ฉันทดสอบ IE 8 และ Chrome 9) สับสนโดย URL สัมพัทธ์ใด ๆ (ที่มีส่วนประกอบพา ธ พา ธ ) ของแหล่งข้อมูลในหน้าซึ่งสร้างผลลัพธ์ที่ไม่ดี ตัวอย่างเช่นหากหน้ามี:
<link rel="stylesheet" href="../../style.css" type="text/css" />
เมื่อโหลดหน้าเว็บเบราว์เซอร์จะขอ/a/b/c/
/a/style.css
แต่หาก/a/b//c/
มีการร้องขอด้วยเหตุผลใดก็ตาม(และเซิร์ฟเวอร์ไม่สนใจสแลชเพิ่มเติม) เบราว์เซอร์จะจบลงด้วยการร้องขอ/a/b/style.css
ซึ่งจะไม่มีอยู่จริง โอ๊ะโอหน้านี้ดูน่าเกลียด
(สิ่งนี้จะไม่เกิดขึ้นหาก URL ไม่มีองค์ประกอบพา ธ พาเรนต์ ( ..
) หรือสัมบูรณ์)
มันเป็นความคิดของฉันที่ Apache และ IIS (และอาจจะคนอื่น ๆ ) จะทำหน้าที่ไม่ถูกต้องเป็น/a/b/c/
และ/a/b//c/
ในทางเทคนิคเป็นตัวแทนของทั้งสองแหล่งที่แตกต่างกัน ตามที่RFC 2396ทุกเครื่องหมายทับมีความสำคัญ:
path = [ abs_path | opaque_part ]
path_segments = segment *( "/" segment )
segment = *pchar *( ";" param )
param = *pchar
pchar = unreserved | escaped |
":" | "@" | "&" | "=" | "+" | "$" | ","
ดังนั้น/a/b/c/
ประกอบด้วยสามส่วน: "a", "b" และ "c"; /a/b//c/
อันที่จริงประกอบด้วยสี่: "a", "b", "" (สตริงว่าง) และ "c" สตริงว่างเปล่าเป็นไดเรกทอรีระบบไฟล์ที่ถูกต้องหรือไม่นั้นเป็นรายละเอียดของแพลตฟอร์มเซิร์ฟเวอร์ (และตามหลักเหตุผลนี่หมายความว่าเบราว์เซอร์ทำงานได้อย่างถูกต้องเมื่อวิเคราะห์ URL สัมพัทธ์กับส่วนประกอบพา ธ พาเรนต์ - ในตัวอย่างของฉันมันจะผ่านไดเรกทอรี "c" และไดเรกทอรี "" ทำให้เราต้องขอstyle.css
จาก "b")
หากคุณใช้ Apache กับmod_rewrite
มีการแก้ไขที่ค่อนข้างง่าย :
# remove multiple slashes anywhere in url
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
สิ่งนี้จะออกการ301 Moved Permanently
เปลี่ยนเส้นทางHTTP เพื่อให้เครื่องหมายสแลชสองครั้งถูกตัดออกจาก URL
mod_rewrite
โซลูชันของคุณคำนึงถึง 3, 4, ... บางสิ่งบางอย่างตามสายของ/{2,}
? (สมมติว่า Apache อนุญาตให้ใช้ปริมาณชนิดนั้นฉันก็ไม่คุ้นเคยกับมันมากเกินไป)
a/b
และa//b
เป็นเส้นทาง URL ที่แตกต่างกันสองเส้นทาง แต่ไม่มีสิ่งใดที่ห้ามไม่ให้เซิร์ฟเวอร์ส่งคืนทรัพยากรเดียวกันสำหรับทั้งคู่หากต้องการ อย่างไรก็ตามฉันเห็นด้วยกับคุณว่าในทางปฏิบัติการส่งคืนการเปลี่ยนเส้นทาง 301 จะมีประโยชน์มากกว่า
a//b
ไดเรกทอรี (ดูตัวอย่างสไตล์ชีทด้านบน)
เครื่องหมายทับสองครั้งมีความหมายเมื่อมันถูกใช้ใน URL ของทรัพยากร ตัวอย่างเช่นเมื่อเป็นผู้ใช้ใน CSS สำหรับ URL ของภาพพื้นหลัง:
.classname {
background : url("//example.com/a/b/c/d.png");
}
นี่หมายความว่าภาพพื้นหลังนี้ดึงมาจากโดเมนอื่นนอกเหนือจากโดเมนของหน้าเว็บปัจจุบัน หรือกล่าวอีกนัยหนึ่งhttp://
สามารถเขียนได้เช่นเดียวกับ//
เมื่อใช้สิ่งนั้นใน URL ของทรัพยากร
แต่เครื่องหมายทับสองครั้งนี้อยู่ระหว่าง URL (เช่น:) /a//b/c/d.htm
ไม่มีความหมายใด ๆ
ดังที่กล่าวไว้เซิร์ฟเวอร์บางเครื่องได้รับการตั้งค่าให้ละเว้นเครื่องหมายทับสองครั้งในเส้นทาง URL แต่การโฮสต์แบบคงที่ของ Amazon S3 จะไม่ หากคุณต้องการจัดการ / เพิกเฉยในกรณีนั้นคุณสามารถใช้กฎการเปลี่ยนเส้นทางในแผงคุณสมบัติ
หากคุณต้องการละเว้นเครื่องหมายสแลชคู่ตามชื่อโดเมนคุณสามารถใช้สิ่งนี้:
<RoutingRules>
<RoutingRule>
<Condition>
<KeyPrefixEquals>/</KeyPrefixEquals>
</Condition>
<Redirect>
<ReplaceKeyPrefixWith/>
</Redirect>
</RoutingRule>
</RoutingRules>
คุณอาจจะสามารถค้นหาและแทนที่พวกมันได้ตลอด แต่นั่นก็เพียงพอแล้วสำหรับฉัน