अगर उपयोग किए बिना सभी ई-मेल अनुरोधों को अमेज़ॅन ईएलबी से वीटीएन के पीछे पुनर्निर्देशित करें


27

वर्तमान में मेरे पास http://www.example.org और https://www.example.org दोनों हैं ।

मैं इसे स्थापित करना चाहूंगा ताकि http://www.example.org की ओर इशारा करते हुए कोई भी अनुरोध https://www.example.org पर पुनर्निर्देशित हो ।

ELB http अनुरोधों के रूप में https अनुरोध भेजता है, इसलिए इसका उपयोग करते हुए:

server {
      listen         80;
       server_name    www.example.org;
       rewrite        ^ https://$server_name$request_uri? permanent;
}

काम नहीं करेगा क्योंकि https://www.example.org पर किए गए अनुरोध अभी भी nginx पर 80 पोर्ट के लिए किए जाएंगे।

मुझे पता है कि इसे फिर से लिखना संभव है

server {
      listen         80;
      server_name    www.example.org;
      if ($http_x_forwarded_proto != "https") {
          rewrite ^(.*)$ https://$server_name$1 permanent;
      }
}

लेकिन मैंने जो कुछ पढ़ा है, उसने कहा है कि ifनगीन विन्यास के भीतर हर कीमत पर इससे बचा जाना चाहिए, और यह हर एक अनुरोध के लिए होगा। इसके अलावा, इसका मतलब है कि मुझे स्वास्थ्य जांच के लिए एक विशेष अलग कॉन्फ़िगरेशन सेट करना होगा ( जैसा कि यहां बताया गया है : "... जब आप एक ईएलबी के पीछे होते हैं, जहां ईएलबी HTTPS समापन बिंदु के रूप में कार्य कर रहा है और केवल आपके सर्वर पर HTTP ट्रैफ़िक भेज रहा है, तो आप स्वास्थ्य जांच के लिए HTTP 200 ओके प्रतिक्रिया के साथ प्रतिक्रिया करने की क्षमता को तोड़ दें जो कि ELB की आवश्यकता है))।

मैं nginx कॉन्फ़िगरेशन के बजाय वेब एप्लिकेशन के कोड में लॉगिन लगाने पर विचार कर रहा हूं (और इस प्रश्न के उद्देश्यों के लिए मान लें कि यह एक Django- आधारित एप्लिकेशन है), लेकिन मुझे यकीन नहीं है कि इससे अधिक ओवरहेड होगा if में विन्यास।


नमस्ते क्या आप मुझे बता सकते हैं कि आपने ये कोड कहां रखे हैं?
यूएएन शाओलिन मैकूले लाई

@ युअनशोलिन मैकलुलेलाइ ज़रूर। ये nginx के लिए कॉन्फ़िगरेशन फ़ाइल हैं, इसलिए मैंने कोड को /etc/nginx/conf.d/ में फ़ाइल में डाल दिया है। मैं आमतौर पर फ़ाइल domainname.conf का नाम देता हूं, जहां "domainname" सवाल में वेबसाइट का डोमेन है। आप फ़ाइल को नाम दे सकते हैं जो आप चाहते हैं कि वह लंबे समय तक समाप्त हो।
जॉर्डन रेइटर

आपका बहुत बहुत धन्यवाद। मैंने .conf के बाद एक नई फ़ाइल बनाने की कोशिश की। लेकिन यह मेरे लिए काम नहीं किया। फिर मैंने उस कोड को फाइल में डाल दिया जो AWS से /etc/nginx/conf.d/ में उत्पन्न हुआ था। यह अब काम करता है।
यूएएन शाओलिन मैकूले लाई

जवाबों:


9

अगर यह सही तरह से काम कर रहा है, तो इससे डरें नहीं। http://wiki.nginx.org/IfIsEvil

यह ध्यान रखना महत्वपूर्ण है कि यदि व्यवहार असंगत नहीं है, तो दो समान अनुरोध दिए गए हैं जो एक पर बेतरतीब ढंग से विफल नहीं होंगे और दूसरे पर काम करेंगे, यदि उचित परीक्षण और समझ का उपयोग किया जा सकता है । अन्य निर्देशों का उपयोग करने की सलाह जहां अभी भी उपलब्ध है, हालांकि बहुत अधिक लागू होती है।


यह पृष्ठ यह भी कहता है कि "यदि स्थान संदर्भ में उपयोग किए जाने पर समस्या है"। मुझे ऐसा लगता है कि आप आप के बाहर नहीं करना पड़ता रहे हैं क्या कर सकता है कि location {}में, server {}बजाय। (लेकिन मुझे पता है कि अगर यह गलत है तो कृपया!)
एक्सकैलिबर

15
  1. सेटअप अपने AWS ELB मानचित्रण ELB: 80 से उदाहरण के लिए: 80 और ELB: 443 से उदाहरण: 1443।
  2. पोर्ट 80 और 1443 पर सुनने के लिए निगनेक्स को बांधें।
  3. पोर्ट 80 पर 443 पोर्ट के लिए अग्रेषित अनुरोध।
  4. स्वास्थ्य जांच HTTP: 1443 होनी चाहिए। यह HTTP: 80 को अस्वीकार कर देता है क्योंकि 301 पुनर्निर्देशित है।

aws एल्ब सेटअप

NGINX सेटअप

    server {
       listen         80;
       server_name    www.example.org;
       rewrite        ^ https://$server_name$request_uri? permanent;
    }

    server {
       listen         1443;
       server_name    www.example.org;
   } 

स्वास्थ्य जांच सेटिंग्स के बारे में क्या? क्या आप कृपया उस पर भी विस्तार से बता सकते हैं।
samkhan13

यह http: 80 के लिए हेल्थ चेक सेट के साथ काम नहीं किया, स्वास्थ्य जांच विफल हो जाती है।
samkhan13

2
स्वास्थ्य जांच होनी चाहिए HTTP:1443। यह खारिज कर देता है HTTP:80क्योंकि 301 पुनर्निर्देशित है।
cbron

यह ज्यादातर मेरे लिए काम करता था लेकिन फिर से लिखना मेरे वाइल्डकार्ड डोमेन के साथ काम नहीं करता था। यह अन्य पोस्ट उस भाग को तय करती है: serverfault.com/questions/447258/…
रॉन

9

यह समाधान सशर्त तर्क का उपयोग करता है, लेकिन जैसा कि स्वीकृत जवाब से पता चलता है, मुझे भी लगता है कि यह ठीक है। Ref: /programming/4833238/nginx-conf-redirect-multiple-conditions

इसके अलावा, छवि के लिए सुरक्षा सेटिंग्स में किसी भी अतिरिक्त पोर्ट को खोलने की आवश्यकता नहीं है। आप AWS LB में ssl को समाप्त कर सकते हैं, और http ट्रैफ़िक को http पोर्ट 80 पर अपने उदाहरण पर रूट कर सकते हैं।

इस उदाहरण में एलबी हेल्थ चेक हिट / हेल्थ पोर्ट 80 पर होता है जो ऐप सर्वर पर रूट करता है, इसलिए हेल्थ चेक नग्नेक्स दोनों को मान्य करता है और आपका ऐप सांस ले रहा है।

server {
  listen 80 default deferred;

  set $redirect_to_https 0;
  if ($http_x_forwarded_proto != 'https') {
    set $redirect_to_https 1;
  }
  if ($request_uri = '/health') {
    set $redirect_to_https 0;
  }
  if ($redirect_to_https = 1) {
    rewrite ^ https://www.example.com$request_uri? permanent;
  }
  ...
}

1
ऐसा करने का एक और अधिक सुंदर तरीका होना चाहिए
एडवर्ड

0

अब आप AWS लोड बैलेंसर सेटिंग्स में एक नया श्रोता बना सकते हैं जो HTTP पोर्ट 80 को HTTPS पोर्ट 443 पर पुनर्निर्देशित करता है। इसलिए आपको अब nginx / apache config को छूने की आवश्यकता नहीं है।


दुर्भाग्य से, यह अभी भी क्लाउडफॉर्म में समर्थित नहीं है
आर्येह लीब टौरोग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.