เครื่องหมายทับคู่หมายถึงอะไรใน URL


32

เครื่องหมายทับสองครั้งที่พบบ่อยใน URL หมายถึงอะไร

ตัวอย่างเช่น:

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

http:โปรดทราบว่าผมไม่ได้หมายถึงการเริ่มต้นหลังจากที่เหมาะสม

คำตอบ:


32

นั่นเป็นข้อผิดพลาดในรหัส 'โปรแกรมเมอร์ /' นักพัฒนา หากคุณเปรียบเทียบ URL ทั้งสองนี้:

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

พวกเขาดูแตกต่างกัน แต่ถ้าคุณไปเยี่ยมทั้งคู่ทั้งสองจะทำงานในเบราว์เซอร์ที่ทันสมัยที่สุด

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


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

33

ตามที่@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


2
จะดีกว่าหรือไม่ถ้าให้mod_rewriteโซลูชันของคุณคำนึงถึง 3, 4, ... บางสิ่งบางอย่างตามสายของ/{2,}? (สมมติว่า Apache อนุญาตให้ใช้ปริมาณชนิดนั้นฉันก็ไม่คุ้นเคยกับมันมากเกินไป)
Ward Muylaert

+1 - ขอบคุณสำหรับข้อมูลพิเศษ ฉันไม่คิดอย่างนั้น!
เบ็นฮอฟฟ์แมน

3
ไม่ใช่พฤติกรรมที่ไม่ถูกต้อง : a/bและa//bเป็นเส้นทาง URL ที่แตกต่างกันสองเส้นทาง แต่ไม่มีสิ่งใดที่ห้ามไม่ให้เซิร์ฟเวอร์ส่งคืนทรัพยากรเดียวกันสำหรับทั้งคู่หากต้องการ อย่างไรก็ตามฉันเห็นด้วยกับคุณว่าในทางปฏิบัติการส่งคืนการเปลี่ยนเส้นทาง 301 จะมีประโยชน์มากกว่า
Ilmari Karonen

4
@IlmariKaronen: มันเป็นพฤติกรรมที่ไม่ถูกต้องอย่างแน่นอนเพราะ (1) พฤติกรรมนี้จะสร้างการอ้างอิงที่ซ้ำซ้อนที่อาจเกิดขึ้นกับแหล่งข้อมูลเดียวโดยอัตโนมัติโดยไม่ จำกัด จำนวน (ซึ่งหากไม่ละเมิดจดหมายของสเป็คใด ๆ (2) มัน "แบ่ง" การจัดการเส้นทางสัมพัทธ์ในเบราว์เซอร์ที่ทำอย่างถูกต้องนับสตริงที่ว่างเปล่าในa//bไดเรกทอรี (ดูตัวอย่างสไตล์ชีทด้านบน)
josh3736

1
... และแล้วฉันเถียงว่า RFC 2396 ไม่ห้ามเซิร์ฟเวอร์กลับมาจากแหล่งข้อมูลเดียวกันโดยอัตโนมัติทับยุบเพราะสเปคกล่าวว่าทุกเฉือนอย่างมีนัยสำคัญ การละเว้นเครื่องหมายสแลชต่อเนื่องโดยอัตโนมัติถือเป็นการละเมิดข้อกำหนดนั้น (เป็นสิ่งหนึ่งถ้ามีคนตั้งโปรแกรมให้เซิร์ฟเวอร์ทำเช่นนั้นแม้ว่าจะทำอย่างงี่เง่าอย่างไรก็ตามเซิร์ฟเวอร์ที่ทำสิ่งนี้โดยค่าเริ่มต้นนั้นไม่ถูกต้อง)
josh3736

4

เครื่องหมายทับสองครั้งมีความหมายเมื่อมันถูกใช้ใน URL ของทรัพยากร ตัวอย่างเช่นเมื่อเป็นผู้ใช้ใน CSS สำหรับ URL ของภาพพื้นหลัง:

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

นี่หมายความว่าภาพพื้นหลังนี้ดึงมาจากโดเมนอื่นนอกเหนือจากโดเมนของหน้าเว็บปัจจุบัน หรือกล่าวอีกนัยหนึ่งhttp://สามารถเขียนได้เช่นเดียวกับ//เมื่อใช้สิ่งนั้นใน URL ของทรัพยากร

แต่เครื่องหมายทับสองครั้งนี้อยู่ระหว่าง URL (เช่น:) /a//b/c/d.htmไม่มีความหมายใด ๆ


ดีนี่ไม่ใช่ความจริงทั้งหมด เครื่องหมายทับสองครั้งจะถูก ised เมื่อจำเป็นต้องหลีกเลี่ยงปัญหาเนื้อหาแบบผสมดังนั้นเมื่อไซต์ถูกโหลดจาก http doubleslash จะขยายเป็น http เมื่อไซต์ถูกโหลดจาก https จะมีการขยาย doubleslash เป็น https
อังเดร

2

ดังที่กล่าวไว้เซิร์ฟเวอร์บางเครื่องได้รับการตั้งค่าให้ละเว้นเครื่องหมายทับสองครั้งในเส้นทาง URL แต่การโฮสต์แบบคงที่ของ Amazon S3 จะไม่ หากคุณต้องการจัดการ / เพิกเฉยในกรณีนั้นคุณสามารถใช้กฎการเปลี่ยนเส้นทางในแผงคุณสมบัติ

หากคุณต้องการละเว้นเครื่องหมายสแลชคู่ตามชื่อโดเมนคุณสามารถใช้สิ่งนี้:

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

คุณอาจจะสามารถค้นหาและแทนที่พวกมันได้ตลอด แต่นั่นก็เพียงพอแล้วสำหรับฉัน

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