nginx เพิ่มเงื่อนไขส่วนหัวบนตัวแปร upstream_http_


19

ฉันมี reverse proxy บน nginx ซึ่งพร็อกซีค่อนข้างบางไซต์ ฉันเพิ่งเปิดใช้งาน HTTP Strict Transport Security สำหรับเว็บไซต์ที่เปิดใช้ SSL ทั้งหมด ตอนนี้ฉันมีเว็บไซต์หนึ่งที่ไม่ต้องการเปิดใช้งานนี้

ฉันคิดว่าฉันจะตรวจสอบอย่างง่าย ๆ ถ้าต้นน้ำของฉันส่ง - ส่วนStrict-Transport-Securityหัวให้ฉันแล้วและถ้าไม่ให้เพิ่มอีกหนึ่งอัน ด้วยวิธีนี้อัปสตรีมของฉันสามารถส่งส่วนหัว STS ที่มีmax-age=0เพื่อหลีกเลี่ยงการเปิดใช้งาน HSTS โดยพร็อกซี

ฉันคิดว่าฉันเพิ่งเปลี่ยนการกำหนดค่าของฉันดังนี้

location / {
        proxy_pass http://webservers;

        proxy_redirect off;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto "https";

        if ($upstream_http_strict_transport_security = "") {
                add_header Strict-Transport-Security "max-age=15552000";
        }
}

แต่อาจเป็นเพราะถ้ามันชั่วร้ายมันก็ไม่ได้ผล ฉันได้ลองทำหลายสิ่งหลายอย่างเพื่อให้แน่ใจว่าตัวแปรมีอยู่จริง (ซึ่งเป็นกรณี) แต่ไม่มีอะไรน่าช่วย

ฉันจะทำงานนี้ได้อย่างไร

คำตอบ:


22

สิ่งนี้ไม่ทำงานเพราะถ้าประเมินก่อนที่คำขอจะถูกส่งผ่านไปยังส่วนหลังดังนั้นตัวแปร $ upstream_http_ ยังไม่มีค่าใด ๆ add_header ที่มีค่าว่างจะถูกข้ามดังนั้นคุณสามารถใช้แผนที่เพื่อเพิ่มส่วนหัวตามเงื่อนไขดังนี้:

map $upstream_http_strict_transport_security $sts {
  '' max-age=15552000;
}

server {
  location / {
    add_header Strict-Transport-Security $sts;
  }
}

1
การใช้แผนที่อย่างชาญฉลาด!
Alexey Ten

ตกลงฉันได้พยายามทำสิ่งที่แตกต่างกันเล็กน้อย แต่ฉันไม่สามารถคิดออก nginx คุณช่วยบอกฉันได้ที่ไหน และคุณสามารถช่วยฉันได้ที่นี่: serverfault.com/questions/678521/ …
Muhammad Umer

5

นั่นเป็นเพราะจะถูกดำเนินการก่อนที่จะใช้สถานที่พร็อกซี่และในขณะนี้มีตัวแปรไม่มีif$upstream_http_strict_transport_security

คุณสามารถใช้header_filter_by_luaคำสั่งจากโมดูล Lua เช่น

header_filter_by_lua 'if not ngx.header["X-Test"] then ngx.header["X-Test"] = "blah" end';

1
วิธีนี้ใช้ได้ผล ใน Debian 7 คุณจะได้รับการสนับสนุนลัวะโดยใช้ Nginx จาก backports apt-get -t wheezy-backports install nginx-extrasผ่าน
Pieter Ennes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.