ฉันต้องการเพิ่มส่วนหัวที่กำหนดเองสำหรับการตอบสนองที่ได้รับจากเซิร์ฟเวอร์หลัง nginx
ในขณะที่add_header
ทำงานสำหรับการตอบสนองที่ประมวลผลด้วย nginx แต่จะไม่ทำอะไรเลยเมื่อproxy_pass
มีการใช้
ฉันต้องการเพิ่มส่วนหัวที่กำหนดเองสำหรับการตอบสนองที่ได้รับจากเซิร์ฟเวอร์หลัง nginx
ในขณะที่add_header
ทำงานสำหรับการตอบสนองที่ประมวลผลด้วย nginx แต่จะไม่ทำอะไรเลยเมื่อproxy_pass
มีการใช้
คำตอบ:
มีโมดูลที่เรียกว่าHttpHeadersMoreModuleที่ให้คุณควบคุมส่วนหัวได้มากขึ้น ไม่ได้มาพร้อมกับ Nginx และต้องติดตั้งเพิ่มเติม ด้วยวิธีนี้คุณสามารถทำสิ่งนี้:
location ... {
more_set_headers "Server: my_server";
}
ซึ่งจะ "ตั้งค่าส่วนหัวเอาต์พุตของเซิร์ฟเวอร์เป็นค่าที่กำหนดเองสำหรับรหัสสถานะและประเภทเนื้อหาใด ๆ " จะแทนที่ส่วนหัวที่ตั้งค่าไว้แล้วหรือเพิ่มหากไม่ได้ตั้งค่า
Secure
และHttpOnly
ธงบนคุกกี้ตอบสนอง ? คุกกี้ตอบกลับเป้าหมายมีเฉพาะคุกกี้name
และexpire
แอตทริบิวต์เท่านั้น
add_header
ใช้งานได้ดีproxy_pass
โดยไม่มี วันนี้ฉันเพิ่งตั้งค่าการกำหนดค่าที่ฉันใช้คำสั่งนั้น ฉันต้องยอมรับว่าแม้ว่าฉันจะพยายามดิ้นรนเช่นกันในการตั้งค่านี้โดยไม่ได้นึกถึงเหตุผล
ตอนนี้ฉันมีการกำหนดค่าที่ใช้งานได้และมีสิ่งต่อไปนี้ (อื่น ๆ ):
server {
server_name .myserver.com
location / {
proxy_pass http://mybackend;
add_header X-Upstream $upstream_addr;
}
}
ก่อน Nginx 1.7.5
add_headerทำงานเฉพาะในการตอบสนองที่ประสบความสำเร็จในทางตรงกันข้ามกับHttpHeadersMoreModuleกล่าวโดยเซบาสเตียนกู๊ดแมนในคำตอบของเขา
เนื่องจาก nginx 1.7.5
คุณสามารถใช้คำหลักalways
เพื่อรวมส่วนหัวที่กำหนดเองได้แม้ในการตอบสนองข้อผิดพลาด ตัวอย่างเช่น:
add_header X-Upstream $upstream_addr always;
ข้อ จำกัด :คุณไม่สามารถแทนที่ค่าใช้ส่วนหัวserver
add_header
add_header X-Upstream $upstream_addr always;
X-Upstream: 10.10.10.10
เทียบกับX-Upstream: 53c2d28edefdf501ab7c92e02a0c1687
(md5 อาจไม่เป็นประโยชน์ในการปิดบังโครงสร้างพื้นฐาน แต่มันบ่งบอกถึงแนวคิด)
add_header
คำสั่ง คุณไม่จำเป็นต้องส่งเลย
ตามที่โอลิเวอร์เขียน:
add_header
ใช้งานได้ดีproxy_pass
โดยไม่มี
อย่างไรก็ตามตามที่ Shane เขียนใน Nginx 1.7.5 คุณจะต้องผ่านalways
เพื่อที่จะได้รับadd_header
การตอบสนองข้อผิดพลาดดังนี้:
add_header X-Upstream $upstream_addr always;
การเพิ่มส่วนหัวที่ใช้add_header
งานได้ดีกับพร็อกซีพาส แต่ถ้ามีค่าส่วนหัวที่มีอยู่ในการตอบสนองก็จะซ้อนค่า
หากคุณต้องการตั้งค่าหรือแทนที่ค่าส่วนหัว (เช่นแทนที่Access-Control-Allow-Origin
ส่วนหัวเพื่อให้ตรงกับไคลเอนต์ของคุณเพื่ออนุญาตการแชร์ทรัพยากรข้ามแหล่งที่มา) คุณสามารถทำได้ดังนี้:
# 1. hide the Access-Control-Allow-Origin from the server response
proxy_hide_header Access-Control-Allow-Origin;
# 2. add a new custom header that allows all * origins instead
add_header Access-Control-Allow-Origin *;
เมื่อproxy_hide_header
รวมเข้ากับadd_header
จะช่วยให้คุณมีอำนาจในการกำหนด / แทนที่ค่าส่วนหัวการตอบสนอง
คำตอบที่คล้ายกันสามารถพบได้ที่นี่บน ServerFault
หมายเหตุ: proxy_set_header
มีไว้สำหรับการตั้งค่าส่วนหัวของคำขอก่อนที่จะส่งคำขอต่อไปไม่ใช่สำหรับการตั้งค่าส่วนหัวการตอบกลับ (แอตทริบิวต์การกำหนดค่าสำหรับส่วนหัวเหล่านี้อาจทำให้สับสนเล็กน้อย)
คุณสามารถลองวิธีนี้:
ในlocation
บล็อกของคุณเมื่อคุณใช้proxy_pass
ทำสิ่งนี้:
location ... {
add_header yourHeaderName yourValue;
proxy_pass xxxx://xxx_my_proxy_addr_xxx;
# Now use this solution:
proxy_ignore_headers yourHeaderName // but set by proxy
# Or if above didn't work maybe this:
proxy_hide_header yourHeaderName // but set by proxy
}
ฉันไม่แน่ใจว่าจะเป็นสิ่งที่คุณต้องการหรือไม่ แต่ลองใช้วิธีนี้และผลลัพธ์อาจจะตรงกับปัญหาของคุณ
นอกจากนี้คุณสามารถใช้ชุดค่าผสมนี้:
proxy_hide_header headerSetByProxy;
set $sent_http_header_set_by_proxy yourValue;
location / { proxy_pass http://127.0.0.1:8080/; proxy_hide_header "Access-Control-Allow-Origin"; if ($http_origin ~* "^https://(example.com|www.example.com)$") { add_header Access-Control-Allow-Origin "$http_origin"; } }