प्रॉक्सी_पास का उपयोग करते समय nginx पर एक प्रतिक्रिया हेडर कैसे जोड़ें?


92

मैं nginx के पीछे सर्वर से प्राप्त प्रतिक्रिया के लिए एक कस्टम हेडर जोड़ना चाहता हूं।

जबकि add_headerनेगनेक्स-संसाधित प्रतिक्रियाओं के लिए काम करता है, यह proxy_passउपयोग किए जाने पर कुछ भी नहीं करता है।


तो आप प्रॉक्सी और उस प्रॉक्सी सेट प्रतिक्रिया के लिए अनुरोध पास करते हैं और इस प्रतिक्रिया पर आप उपयोगकर्ता को भेजने से पहले अपने कस्टम हेडर को जोड़ना चाहेंगे, यह सही है?
emka86

जवाबों:


31

HttpHeadersMoreModule नामक एक मॉड्यूल है जो आपको हेडर पर अधिक नियंत्रण प्रदान करता है। यह नगनेक्स के साथ नहीं आता है और अतिरिक्त स्थापना की आवश्यकता होती है। इसके साथ, आप कुछ इस तरह से कर सकते हैं:

location ... {
  more_set_headers "Server: my_server";
}

यह "सर्वर आउटपुट हेडर को किसी भी स्थिति कोड और किसी भी सामग्री प्रकार के लिए कस्टम मूल्य पर सेट करेगा"। यह हेडर की जगह लेगा जो पहले से ही सेट हैं या यदि कोई परेशान है तो उन्हें जोड़ें।


क्या प्रतिक्रिया कुकी पर झंडे जोड़ना Secureऔर बनाना संभव है ? लक्ष्य प्रतिक्रिया कुकी में केवल कुकी और विशेषताएँ ही होती हैं। HttpOnlynameexpire
JPaulPunzalan

2
जरूरी नहीं कि आपको किसी हेडर को बदलने या जोड़ने में सक्षम होने के लिए एक लाइब्रेरी की आवश्यकता हो और सबसे ऊपर वाले वोट के जवाब के विपरीत आप एक हेडर को ओवरराइड कर सकते हैं, आपको बस इसे पहले निकालना होगा। विवरण के लिए नीचे मेरे उत्तर की जाँच करें ।
विल्ट

162

add_header साथ ही काम करता है proxy_pass ही बिना । मैंने अभी एक कॉन्फ़िगरेशन स्थापित किया है, जहां मैंने उस निर्देश का उपयोग किया है। मुझे स्वीकार करना होगा कि मैंने संघर्ष किया है और साथ ही साथ इस कारण को याद किए बिना इसे स्थापित करना है, हालाँकि।

अभी मेरे पास एक कार्यशील विन्यास है और इसमें निम्नलिखित शामिल हैं (अन्य के बीच):

server {
    server_name  .myserver.com
    location / {
        proxy_pass  http://mybackend;
        add_header  X-Upstream  $upstream_addr;
    }
}

इससे पहले कि 1.7.5 नगनेक्स add_header ने अपने जवाब में सेबास्टियन गुडमैन द्वारा उल्लिखित HttpHeadersMoreModule के विपरीत केवल सफल प्रतिक्रियाओं पर काम किया ।

Nginx के बाद से 1.7.5आप alwaysत्रुटि प्रतिक्रियाओं में भी कस्टम हेडर शामिल करने के लिए कीवर्ड का उपयोग कर सकते हैं । उदाहरण के लिए:

add_header X-Upstream $upstream_addr always;

सीमा: आप serverहेडर मान का उपयोग करके ओवरराइड नहीं कर सकते add_header


41
Nginx 1.7.5 के बाद से आप add_header के उपयोग से त्रुटि प्रतिक्रियाओं में कस्टम हेडर शामिल करने के लिए "हमेशा" का उपयोग कर सकते हैं:add_header X-Upstream $upstream_addr always;
शेन

वैसे भी समरूप सर्वर के आईपी / पोर्ट संयोजन को उजागर करने की समान कार्यक्षमता w / o है? उदा। X-Upstream: 10.10.10.10बनाम X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687(md5 शायद बुनियादी ढांचे को मास्क करने में मददगार नहीं है, लेकिन यह इस विचार को व्यक्त करता है)।
ज़मनीट्स

@zamnuts: अपस्ट्रीम आईपी और पोर्ट नंबरों को पास करना add_headerनिर्देशन का उपयोग करने का एक उदाहरण है । आपको उन्हें बिल्कुल नहीं भेजना है।
ओलिवर

@ पूरी तरह से, मुझे इस बारे में पता है, लेकिन मैं एक वैकल्पिक व्यक्ति / आईपी या पोर्ट नंबर, या उसके बाद एक अपक्षय के अलावा अन्य विशिष्ट अपस्ट्रीम पहचानकर्ता के बारे में पूछताछ कर रहा था। शायद मेरा सवाल दायरे से बाहर है और मुझे एक नया पोस्ट बनाना चाहिए :)
zamnuts

@zamnuts: मैं एक नया सवाल पूछने का सुझाव दूंगा, :-)
ओलिवर

25

जैसा कि ओलिवर लिखते हैं:

add_headerसाथ proxy_passही बिना काम करता है ।

हालाँकि, जैसा कि शेन लिखते हैं, नगनेक्स 1.7.5 के रूप में, आपको त्रुटि प्रतिक्रियाओं के लिए काम alwaysकरने के लिए पास होना चाहिए add_header, जैसे:

add_header  X-Upstream  $upstream_addr always;

5
मैंने लंबे समय तक यह सोचकर बिताया कि मेरे हेडर क्यों नहीं दिखा रहे थे, उन्हें सर्वर ब्लॉक, लोकेशन ब्लॉक, में ले जाने की कोशिश कर रहे थे ... और यहाँ कारण था: nginx उन्हें त्रुटि प्रतिक्रियाओं पर नहीं जोड़ता है: F धन्यवाद
Shautieh

मुझे भी :) और इस जवाब के बावजूद यह मेरे लिए दूसरे दिन फिर से हुआ। अपने ही उत्तर की समीक्षा करनी थी।
दिमित्री मिन्कोवस्की

देखें nginx.org/en/docs/http/ngx_http_headers_module.html#add_header जानकारी के लिए
स्टीव Eynon

15

प्रतिक्रिया हैडर को छुपाएं और फिर एक नया कस्टम हेडर मान जोड़ें

हेडर पास के साथ 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प्रतिक्रिया हेडर मान सेट / बदलने की शक्ति देता है।

इसी तरह का जवाब यहां सर्वरफॉल्ट पर मिल सकता है

अपडेट करें:

नोट: proxy_set_header अनुरोध हेडर भेजने से पहले अनुरोध हेडर सेट करने के लिए है, प्रतिक्रिया हेडर सेट करने के लिए नहीं (हेडर के लिए ये कॉन्फ़िगरेशन विशेषताएँ थोड़ा भ्रमित हो सकती हैं)।


धन्यवाद, बहुत मदद
लानसर।

14

आप इस समाधान की कोशिश कर सकते हैं:

अपने 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;

6
मुझे इस विधि का उपयोग करना था क्योंकि नग्नेक्स एक बाहर निकलने वाले को ओवरराइट करने के बजाय एक डुप्लिकेट हेडर जोड़ रहा था। 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"; } }
ईथर 6
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.