ยอมรับส่วนหัวการตอบกลับ HTTP ซ้ำกันหรือไม่


123

ฉันไม่พบข้อกำหนดใด ๆ เกี่ยวกับว่ามาตรฐานอนุญาตให้ใช้ส่วนหัวการตอบกลับ HTTP ที่ซ้ำกันหรือไม่ แต่ฉันต้องการทราบว่าสิ่งนี้จะทำให้เกิดปัญหาความเข้ากันได้หรือไม่

สมมติว่าฉันมีส่วนหัวการตอบสนองดังนี้:

HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
X-Powered-By: Servlet 2.4; JBoss-4.0.3SP1 (build: CVSTag=JBoss_4_0_3_SP1 date=200510231054)/Tomcat-5.5
Cache-Control: no-cache
Cache-Control: no-store
Location: http://localhost:9876/foo.bar
Content-Language: en-US
Content-Length: 0
Date: Mon, 06 Dec 2010 21:18:26 GMT

สังเกตว่ามีสองCache-Controlส่วนหัวที่มีค่าต่างกัน เบราว์เซอร์มักจะปฏิบัติต่อพวกเขาราวกับว่ามีการเขียนเช่น "Cache-Control: no-cache, no-store" หรือไม่

คำตอบ:


157

ใช่

HTTP RFC2616 มีให้ที่นี่พูดว่า:

ฟิลด์ส่วนหัวของข้อความหลายช่องที่มีชื่อฟิลด์เดียวกันอาจปรากฏในข้อความก็ต่อเมื่อค่าฟิลด์ทั้งหมดสำหรับฟิลด์ส่วนหัวนั้นถูกกำหนดเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาค [เช่น # (ค่า)] ต้องเป็นไปได้ที่จะรวมฟิลด์ส่วนหัวหลายฟิลด์ไว้ในคู่ "field-name: field-value" คู่เดียวโดยไม่ต้องเปลี่ยนความหมายของข้อความโดยการต่อท้ายค่าฟิลด์ที่ตามมาแต่ละฟิลด์เป็นค่าแรกโดยคั่นด้วยเครื่องหมายจุลภาค ลำดับที่รับฟิลด์ส่วนหัวที่มีชื่อฟิลด์เดียวกันจึงมีความสำคัญต่อการตีความค่าฟิลด์ที่รวมกันดังนั้นพร็อกซีต้องไม่เปลี่ยนลำดับของค่าฟิลด์เหล่านี้เมื่อส่งต่อข้อความ

ดังนั้นหลายส่วนหัวที่มีชื่อเดียวกันก็ใช้ได้ (www-authenticate เป็นเช่นนั้น) หากกำหนดค่าฟิลด์ทั้งหมดเป็นรายการค่าที่คั่นด้วยเครื่องหมายจุลภาค

การควบคุมแคชมีเอกสารอยู่ที่นี่: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9ดังนี้:

Cache-Control   = "Cache-Control" ":" 1#cache-directive

#1cache-directiveไวยากรณ์กำหนดรายชื่ออย่างน้อยหนึ่งองค์ประกอบแคชสั่ง (ดูที่นี่สำหรับความหมายอย่างเป็นทางการของ #values กตกลงเกี่ยวกับเครื่องหมายและไวยากรณ์ทั่วไป )

ใช่,

Cache-Control: no-cache, no-store

เทียบเท่ากับ (คำสั่งเป็นสิ่งสำคัญ)

Cache-Control: no-cache
Cache-Control: no-store

2
ขอบคุณสำหรับการตอบกลับอย่างรวดเร็ว Simon! แต่ย่อหน้าที่ยกมาจาก RFC 2616 ใช้กับ Cache-Control ด้วยหรือไม่? ฉันพลาดอะไรไปรึเปล่า?
ซูจาง

1
ถูกต้องเกือบ 100% การควบคุมแคชอนุญาตให้มีหลายค่า: Cache-Control = "Cache-Control" ":" 1#cache-directive. แจ้งให้ทราบก่อน# cache-directiveนั่นแสดงว่ายอมรับหลายค่า (จากคำจำกัดความของคุณด้านบน) ...
ircmaxell

1
"ถ้าและเฉพาะในกรณีที่ค่าฟิลด์ทั้งหมดสำหรับฟิลด์ส่วนหัวนั้นถูกกำหนดเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาค" สำหรับฉันแล้วดูเหมือนว่าค่าหลายค่าจะต้องถูกกำหนดเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาคกล่าวคือไม่สามารถ แยกเป็นส่วนหัวแยกกัน
mpen

2
@mark - "กำหนดเป็นรายการที่คั่นด้วยจุลภาค" ในที่นี้หมายถึง "กำหนดไว้ในไวยากรณ์ BNF เป็นรายการที่คั่นด้วยจุลภาค" ฟิลด์ควบคุมแคชถูกกำหนดไว้เช่นนั้น (x # blahblah)
Simon Mourier

2
ส่วนใน RFC 7230 รุ่นใหม่ที่พูดถึงการจัดการส่วนหัวหลายรายการคือtools.ietf.org/html/rfc7230#section-3.2.2
Matthew Buckett

0

โปรดทราบว่า HSTS RFC6797 ขัดแย้งกับ RFC2616 (ละเมิดภาษา "if and only if") โดยกำหนดลักษณะการทำงานสำหรับอินสแตนซ์หลายรายการของส่วนหัว STS แม้ว่าจะไม่ได้เติมค่าด้วยค่าที่คั่นด้วยเครื่องหมายจุลภาค:

  "If a UA receives more than one STS header field in an HTTP
  response message over secure transport, then the UA MUST process
  only the first such header field."

ไม่ถูกต้อง RFC6797 ไม่ได้กำหนดส่วนหัว STS ว่ามีรายการที่คั่นด้วยเครื่องหมายจุลภาค ดังนั้นกฎ "if and only if" จาก RFC 2616 จึงใช้เหมือนกัน (หมายความว่าไม่อนุญาตให้ใช้ส่วนหัว STS หลายตัวเนื่องจากส่วนหัว STS ไม่ได้กำหนดให้ใช้รายการที่คั่นด้วยจุลภาค) RFC6797 ทำให้ไม่สามารถกำหนดได้ว่าผลที่ตามมาจากการละเมิดกฎนั้นเป็นอย่างไรบางสิ่งที่ RFC2616 ดูเหมือนจะเปิดไว้
Frans
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.