लोड बैलेंसर के पीछे ngnix के साथ http से https को फिर से लिखना


13

मैं एक रैकस्पेस लोड बैलेंसर का उपयोग कर रहा हूं जो मुझे व्यवस्थापक पैनल के अंदर मेरी एसएसएल कुंजी / पीएम सेट करने में सक्षम बनाता है। सब कुछ ठीक काम करता है, मैं http और https दोनों प्रोटोकॉल का उपयोग कर सकता हूं। लेकिन अगर मैं http का उपयोग करके https को पुनर्निर्देशित करने की कोशिश करता हूं:

server{
  listen *:80;
  server_name mydomain.com www.mydomain.com; 
  rewrite ^ https://mydomain.com$request_uri? permanent;

... मुझे एक अनुप्रेषित लूप मिलता है। मुझे लगता है कि मैं 443 पोर्ट नहीं सुन रहा हूँ लेकिन ऐसा इसलिए है क्योंकि लोड बैलेंसर ने मेरे लिए काम संभाला है। मैंने भी if ($scheme ~* http){कोई फायदा नहीं हुआ फिर से लिखने की कोशिश की ।

मेरे प्रश्न का दूसरा भाग यह है कि मैं www को url से निकालना चाहूंगा, क्या मैं इसे एक एकल पुनर्लेखन के साथ कर सकता हूं? क्या इसके बाद के संस्करण को फिर से लिखना नहीं चाहिए?

आपकी सहायताके लिए धन्यवाद!


लोड बैलेंसर आपको कुछ संकेत भेज रहा होगा कि क्या कनेक्शन HTTPS था। रैकस्पेस से पूछें। (ओह, और आप शायद www से छुटकारा नहीं चाहते ...)
माइकल हैम्पटन

दिलचस्प है, मैं उस पर गौर करूंगा। आपको क्यों लगता है कि मुझे www से छुटकारा नहीं चाहिए?
जेवरे

जवाबों:


14

साइटकस सही है कि रैकस्पेस के क्लाउड लोड Balancers ने X-फॉरवर्डेड-प्रोटो को https पर सेट किया है जब एसएसएल को लोड बैलेंसर पर लोड किया जाता है। Nginx में एक अनुप्रेषित लूप से बचने के लिए, आपको निम्नलिखित को locationvhost कॉन्फ़िगरेशन में अनुभाग में जोड़ने में सक्षम होना चाहिए :

if ($http_x_forwarded_proto = "http") {
            rewrite  ^/(.*)$  https://mydomain.com/$1 permanent;
}

गैर-https अनुरोधों को https पर पुनर्निर्देशित करते समय अनंत लूप लूप से बचना चाहिए।


18

नंगेक्स के बिल्ट-इन सर्वर वैरिएबल का उपयोग करके $request_uriऔर $server_nameआप नियमित अभिव्यक्ति का उपयोग किए बिना ऐसा कर सकते हैं। अपने सर्वर के locationब्लॉक में निम्नलिखित जोड़ें और आपका काम हो गया:

if ($http_x_forwarded_proto = "http") {
    return 301 https://$server_name$request_uri;
}

यह मानता है कि आपका लोड बैलेंसर $http_x_forwarded_protoहेडर को आपके बैकेंड इंस्टेंस के अनुरोध के साथ भेज रहा है । अन्य आम हेडर में शामिल हैं $http_x_forwarded_schemeऔर सिर्फ $scheme

अधिक जानकारी nginx नुकसान और सामान्य गलतियों के दस्तावेज में पाया जा सकता है : https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitashes/#taxing-rewrites


5
फिर से लिखना पर वापस उपयोग करना चाहिए। Upvoted।
designermonkey

1
आप $hostइसके बजाय$server_name
Yossi

server_name _ के साथ काम नहीं करता है; इसलिए किसी को @Yossi के सुझाव के अनुसार $ होस्ट चर का उपयोग करना चाहिए।
रज़वान ग्रिगोर

1

लोड बॉलर हमेशा http पर आपसे बात करता है। क्या हो रहा है

  1. ब्राउज़र लोड बैलेंसर पर 80 पोर्ट करने का अनुरोध करता है
  2. लोड बैलेंसर आपके वेब सर्वर पर 80 पोर्ट करने का अनुरोध करता है
  3. आपका वेब सर्वर उपयोगकर्ता को एक रीडायरेक्ट भेजता है
  4. उपयोगकर्ता लोड बैलेंसर पर 443 पोर्ट करने का अनुरोध करता है

चरण 2-4 दोहराते रहें जब तक कि ब्राउज़र पुनर्निर्देशित लूप का पता नहीं लगाता है और छोड़ देता है।

EDIT: इसे हल करने के लिए, केवल तब ही राइट करें जब X-फॉरवर्डेड-प्रोटो हेडर http पर सेट हो। वह शीर्ष लेख है कि कैसे रैकस्पेस का लोड बैलेंसर आपके वेब सर्वर को प्रोटोकॉल बताता है जिसके माध्यम से उसे अनुरोध प्राप्त हुआ।


मुझे लगता है कि समझा जाएगा कि $ server_protocol हमेशा HTTP
jwerre

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