nginx प्रॉक्सी पास रीडायरेक्ट पोर्ट को अनदेखा करता है


34

इसलिए मैं अपने nginx conf में एक नोड.जेएस ऐप की ओर इशारा करते हुए एक आभासी पथ स्थापित कर रहा हूं। संबंधित अनुभाग ऐसा दिखता है:

location /app {
  rewrite /app/(.*) /$1 break;
  proxy_pass http://localhost:3000;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

महान काम करता है, सिवाय इसके कि जब मेरे नोड.जेएस ऐप (एक एक्सप्रेस ऐप) एक रीडायरेक्ट कहता है।

एक उदाहरण के रूप में, देव बॉक्स पोर्ट 8080 पर nginx चल रहा है, और इसलिए नोड के मूल में यूआरएल इस प्रकार दिखता है:

http: // localhost: 8080 / ऐप्स

जब मैं नोड से '/ ऐप' पर रीडायरेक्ट कॉल करता हूं, तो वास्तविक रीडायरेक्ट निम्न पर जाता है:

http: // localhost / ऐप्स


यहाँ कुछ जवाब जो सुझाव देते हैं: प्रॉक्सी_सेट_हीडर होस्ट http_host; लेकिन किसी ने यह नहीं कहा कि यह भेद्यता (होस्ट हेडर अटैक) पैदा कर सकता है। यहाँ उदाहरण हमला और अधिक जानकारी के लिए यहाँ

जवाबों:


14

समस्या यह है कि Node.js एप्लिकेशन रीडायरेक्ट को सही तरीके से जारी नहीं कर रहा है। आप इसे proxy_redirectnginx में ठीक करने के लिए उपयोग करने में सक्षम हो सकते हैं :

proxy_redirect http://localhost/ http://localhost:8080/;

47

मुझे बस जेनकिंस के साथ समस्या को हल करना था जो कि नग्नेक्स के पीछे चल रहा था। मेरे लिए यह क्या किया गया था कि हम हेडकांस्ट में सर्वर पोर्ट को शामिल करें Hostजो जेनकिंस को भेजा जा रहा है:

proxy_set_header Host $host:$server_port;

उम्मीद है की वो मदद करदे।


3
बिंगो। जैसा @mgorven कहते हैं, नोड पुनर्निर्देशन को बुरी तरह से सेट कर रहा है, क्योंकि nginx मेजबान को बुरी तरह से अग्रेषित कर रहा है
Eric

5

मैंने उपरोक्त समाधानों की कोशिश की, लेकिन जब भी नोड अनुप्रयोग ने स्थान हेडर में पूरी तरह से योग्य URL जारी किया, जैसे " http://nodeapp.com:8080/new/location "

इसलिए मैं होस्ट और पोर्ट पास करने के लिए $ http_host का उपयोग करके घाव करता हूं। और पूरी तरह से यूआरएल को फिर से लिखने के लिए एक मैच ~ ^ का उपयोग करना।

  proxy_pass http://10.0.0.3:8080;

  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $http_host;

  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  proxy_redirect default;
  proxy_redirect ~^(https?://[^:]+):\d+(?<relpath>/.+)$ http://10.0.0.3:8000$relpath;

हमारे मामले में, नोड सर्वर 8080 पर चल रहा है, और हमारा nginx प्रॉक्सी 8000 पर चल रहा है। इसका मतलब है कि किसी स्थान हेडर में हर पूरी तरह से योग्य URL को फिर से लिखना होगा। आशा है कि यह किसी की मदद करता है !!


4

इस सवाल पर बातचीत के अनुसार , उचित संकल्प प्रॉक्सी के Hostहेडर निर्देश को समायोजित करना है ।

इसे बदलो:

proxy_set_header Host $host;

इसके लिए:

proxy_set_header Host $http_host;

$http_hostHTTP HOST हेडर में निर्दिष्ट मान को रखता है, जिसमें पोर्ट शामिल है। रीडायरेक्ट को ओपी के सेटअप के लिए कस्टमाइज़ेशन के बिना कस्टम पोर्ट को चुनना चाहिए।

ये उत्तर (एक ही टिकट) आगे विस्तृत:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.