nginx एक upstream_http_ वैरिएबल पर हेडर सशर्त जोड़ता है


19

मेरे पास nginx पर एक रिवर्स प्रॉक्सी है जो काफी कुछ साइटों को सम्‍मिलित करता है। मैंने हाल ही में एसएसएल-सक्षम वेबसाइटों के लिए HTTP सख्त परिवहन सुरक्षा को सक्षम किया है। अब मेरे पास एक साइट है जो यह सक्षम नहीं करना चाहती है।

मुझे लगा कि मैं सिर्फ एक साधारण जांच करूंगा अगर मेरे अपस्ट्रीम ने पहले ही मुझे एक Strict-Transport-Security-हाइडर भेज दिया है , और यदि नहीं, तो बस एक जोड़ें। इस तरह, मेरा अपस्ट्रीम एसटीएस हेडर भेज सकता है जिसमें max-age=0प्रॉक्सी द्वारा एचएसटीएस सक्षम होने से बचना चाहिए।

मुझे लगा कि मैं अपना विन्यास इस प्रकार बदलूंगा:

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
नक्शे का चतुर उपयोग!
एलेक्सी टेन

ठीक है, मैं कुछ अलग करने की कोशिश कर रहा हूं, लेकिन मैं नग्नेक्स का पता नहीं लगा सका। क्या आप मुझे बता सकते हैं कि मैं औपचारिक रूप से nginx कहाँ सीख सकता हूँ। : और भी तुम मुझे यहाँ मदद कर सकते हैं serverfault.com/questions/678521/...
मुहम्मद उमर

5

ऐसा इसलिए ifहै क्योंकि प्रॉक्सी को ले जाने से पहले निष्पादित किया जाता है और इस समय कोई चर नहीं है $upstream_http_strict_transport_security

आप header_filter_by_luaलुआ मॉड्यूल से निर्देश का उपयोग कर सकते हैं । उदाहरण के लिए

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

1
यह काम। डेबियन 7 पर आप नेजेन्क्स का उपयोग बैकस्पोर्ट्स के माध्यम से एलयूए समर्थन प्राप्त कर सकते हैं apt-get -t wheezy-backports install nginx-extras
पीटर एन्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.