HTTP से HTTPS तक EC2 इलास्टिक लोड बैलेंसर को पुनर्निर्देशित करना


104

मैं ईएलबी पर https अनुरोध के सभी HTTP अनुरोध को पुनर्निर्देशित करना चाहता हूं । मेरे पास दो EC2 उदाहरण हैं। मैं सर्वर के लिए nginx का उपयोग कर रहा हूं। मैंने nginx conf फ़ाइलों को बिना किसी सफलता के फिर से लिखने की कोशिश की है। मुझे इस पर कुछ सलाह पसंद आएगी।


1
ऐसा लगता है कि इंटरनेट इस समस्या के एकल, पूर्ण और कार्यशील समाधान पर सहमत नहीं हो सकता है। उम्मीद है आपको मेरी पोस्ट में यहाँ कुछ मदद मिल सकती है । मुझे इसके साथ आने के लिए हुप्स के माध्यम से कूदना पड़ा, आखिरकार।
ADTC

1
इस ans के पास नवीनतम समाधान है, स्वीकृत
ऐसर

जवाबों:


87

AWS एप्लिकेशन लोड Balancers अब HTTPS पुनर्निर्देशन के लिए मूल HTTP का समर्थन करते हैं।

कंसोल में इसे सक्षम करने के लिए, निम्न कार्य करें:

  1. EC2 में अपने लोड बैलेंसर पर जाएं और "श्रोता" टैब करें
  2. अपने HTTP श्रोता पर "नियम देखें / संपादित करें" चुनें
  3. डिफ़ॉल्ट एक को छोड़कर सभी नियम हटाएं (नीचे)
  4. डिफ़ॉल्ट नियम संपादित करें: एक कार्रवाई के रूप में "पुनर्निर्देशित करें" चुनें, सब कुछ डिफ़ॉल्ट के रूप में छोड़ दें और "443" पोर्ट के रूप में दर्ज करें।

मूल पुनर्निर्देशन श्रोता नियम

यहाँ वर्णित सीएलआई का उपयोग करके समान प्राप्त किया जा सकता है

क्लाउडफॉर्म में ऐसा करना भी संभव है, जहां आपको इस तरह एक श्रोता वस्तु स्थापित करने की आवश्यकता है:

  HttpListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref LoadBalancer
      Port: 80
      Protocol: HTTP
      DefaultActions:
      - Type: redirect 
        RedirectConfig:
          Protocol: HTTPS
          StatusCode: HTTP_301
          Port: 443

यदि आप अभी भी क्लासिक लोड Balancers का उपयोग करते हैं, तो दूसरों द्वारा वर्णित NGINX कॉन्फ़िगरेशन में से एक के साथ जाएं।


1
अब इसका आसान जानने के लिए बहुत उपयोगी है। लेकिन यह एक लिंक के बजाय क्या कॉन्फ़िगर करने के बारे में अधिक जानकारी के साथ एक बेहतर जवाब होगा।
जॉन रीस

1
@ जॉनर ने जवाब को तदनुसार संपादित किया, आशा है कि यह मदद करता है
उल्ली

अच्छा लगा। मैंने आपको शून्य पर पहुंचने के लिए उकसाया था। आप अधिक के लायक हैं।
जॉन रीस

2
@ फ़्लोरियन आप एक क्लासिक लोड बैलेंसर का उपयोग कर रहे हैं। उस विकल्प को पाने के लिए एप्लिकेशन लोड बैलेंसर पर स्विच करें
Ulli

मैं अपने उदाहरण के लिए एप्लिकेशन लोड बैलेंसर कैसे निर्दिष्ट करूं? (जैसा कि कोई instancesटैब नहीं है )
फ्लोरियन

107

ईएलबी X-Forwarded-Protoहेडर सेट करता है , आप इसका उपयोग यह पता लगाने के लिए कर सकते हैं कि मूल अनुरोध HTTP पर था और फिर HTTPS पर रीडायरेक्ट हुआ।

आप इसे अपने प्रयास में आजमा सकते हैं server:

if ($http_x_forwarded_proto = 'http') {
    return 301 https://yourdomain.com$request_uri;
}

ELB डॉक्स पर एक नज़र डालें ।


3
यह कॉन्फ़िगरेशन कहां से किया जाता है?
ericpeters0n

2
@ ericpeters0n उत्तर में स्निपेट nginxकॉन्फ़िगरेशन के लिए है, लेकिन सिद्धांत किसी भी वेब सर्वर पर लागू होता है।
दिमित्री मुखिन

1
यदि आप यात्री-स्टैंडअलोन के साथ बीनस्टॉक का उपयोग कर रहे हैं, तो nginx कॉन्फ़िगरेशन को बदलने के लिए इस लिंक का पालन करें। qiita.com/tak_nishida/items/cf30a2d373744943b943
Yeonho

3
सुनिश्चित करें कि आपके पास अपने लोड बैलेंसर पर HTTP और HTTPS श्रोता हैं।
गैविन पामर

1
@ रोंल्ड, सर्वर से प्रतिक्रिया में मेरा मतलब है कि n2x सर्वर ec2 उदाहरणों पर है जो ELB के पीछे चल रहे हैं।
दिमित्री मुखिन

34

मुझे एक ही समस्या थी, मेरी स्थिति में HTTPS को पूरी तरह से ELB द्वारा संभाला गया था और मुझे समय से पहले अपने स्रोत डोमेन का पता नहीं था इसलिए मैंने कुछ ऐसा करना समाप्त कर दिया:

server {
  listen 81;
  return 301 https://$host$request_uri;
}

server {
  listen 80;
  # regular server rules ...
}

और फिर निश्चित रूप से ELB 'https' को उदाहरण पोर्ट 80 और फिर 'http' मार्ग को उदाहरण पोर्ट 81 पर इंगित करता है।


3
यह जीनियस है।
एंडी हेडन

2
@CodyBugstein यह nginx config है, अगर आपके पास एक है
तैमूरो

@timurso यदि आपके पास क्या है?
कोडीबस्टीन

अगर आप अपने आवेदन के सामने nginx है, तो @CodyBugstein (मैं, उदाहरण के लिए, नहीं - यह सीधे एक कंटेनर एक्सप्रेस
ExpressJS

नगीनक्स कहाँ जाएगा? ईएलबी के अंदर? EC2 के अंदर? क्या यह इलास्टिक बीनस्टॉक में कहीं कॉन्फ़िगर किया गया है?
CodyBugstein

16

अमेज़ॅन इलास्टिक लोड बैलेंसर (ELB) एक HTTP हेडर का समर्थन करता है जिसे X-FORWARDED-PROTO कहा जाता है। ELB के माध्यम से जाने वाले सभी HTTPS अनुरोधों में "HTTPS" के बराबर X-FORWARDED-PROTO का मूल्य होगा। HTTP अनुरोधों के लिए, आप सरल रीराइट नियम का पालन करके HTTPS को बाध्य कर सकते हैं। मेरे लिए यह ठीक काम करता है!

अमरीका की एक मूल जनजाति

आप अपनी .htaccess फ़ाइल में निम्न पंक्तियाँ जोड़ सकते हैं:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}

या यदि आप एक ही EC2 वेब सर्वर में कई डोमेन के प्रबंधन के लिए vhost.conf का उपयोग करते हैं तो आप निम्नलिखित को vhost.conf में जोड़ सकते हैं (इसे उस डोमेन में जोड़ें जिसे आप इसके लिए https का उपयोग करना चाहते हैं):

<VirtualHost *:80>
...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
...
</VirtualHost>

आईआईएस

IIS Url-Rewrite मॉड्यूल स्थापित करें, कॉन्फ़िगरेशन GUI का उपयोग करके इन सेटिंग्स को जोड़ें:

<rewrite xdt:Transform="Insert">
<rules>
<rule name="HTTPS rewrite behind ELB rule" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions>
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{SERVER_NAME}{URL}" />
</rule>
</rules>
</rewrite>

और पढ़ें यहाँ


हमारे पास सामान्य http ट्रैफ़िक को रीडायरेक्ट करने का मुद्दा था क्योंकि हेडर भी मौजूद नहीं था। मैं इसे हालत बनाकर हल करता हूं:RewriteCond %{HTTP:X-Forwarded-Proto} !(https|^$)
natronite

यह अनंत पुनर्निर्देश का कारण बन रहा है। मैं विंडोज़ सर्वर के साथ IIS का उपयोग कर रहा हूं।
यह 4

@ इटट्रैप: IIS के लिए यदि यह काम नहीं करता है तो इस URL में स्क्रिप्ट आज़माएं: stephen.genoprime.com/2012/01/01/aws-elb-ssl-with-iis.html
इमान सेदीघी

5

ऊपर दिए गए htaccess समाधान ELB स्वास्थ्य की जाँच में विफल रहे। मुझे तब तक समाधान खोजने में कुछ परेशानी हुई जब तक मैंने ऑनलाइन एक लेख नहीं खोज लिया जिसमें किसी के पास वही मुद्दे थे जो मेरे पास थे। उसका समाधान इसके बजाय htaccess फ़ाइल की शुरुआत में जोड़ना था:

RewriteEngine on 
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

ईएलबी के माध्यम से एचटीटीपीएस के माध्यम से बाहरी अनुरोधों को पुनर्निर्देशित करते हुए HTTP पर इसे और अन्य स्थानीय अनुरोधों को अनुमति देने के लिए, https पर नकारात्मक मैच के बजाय http पर मिलान करने के लिए पुनर्लेखन शर्त को समायोजित करें।

स्रोत: AWS और ELB के साथ HTTP को HTTPS पर पुनर्निर्देशित करना


"https पर नकारात्मक मैच के बजाय http पर मेल करने के लिए फिर से लिखने की स्थिति को समायोजित करें" यही वह हिस्सा है जिसे मैं ठीक करने की कोशिश कर रहा था। धन्यवाद!
मेरिकट

4

यह वह समाधान नहीं हो सकता है जिसे आप खोज रहे हैं, लेकिन ईएलबी के अलावा AWS CloudFront का उपयोग करने के लिए एक और विकल्प हो सकता है। CloudFront HTTPS में आने वाले सभी HTTP ट्रैफिक को रीडायरेक्ट करने का विकल्प देती है।



3

मुझे नग्नेक्स और ईएलबी कॉन्फ़िगरेशन के साथ अजीब समस्या थी। मेरे सेटअप में ELB के पीछे एक nginx के अंदर 3 अलग-अलग सेवाएं शामिल थीं। और मेरे पास मिश्रित सामग्री का मुद्दा था: जब आपका अनुरोध ELB के लिए https है, लेकिन केवल ELB http के अंदर, और सर्वर http का उपयोग करके स्थैतिक के लिए सापेक्ष पथ बनाता है, इसलिए ब्राउज़र 'मिश्रित सामग्री' समस्या के साथ विफल हो जाता है। और मुझे http / https दोनों कामों के लिए बिना किसी पुनर्निर्देशन के समाधान बनाना होगा।

यहाँ विन्यास nginx/conf.d/फ़ोल्डर में स्थित है :

# Required for http/https switching
map $http_x_forwarded_port $switch {
  default   off;
  "80"    off;
  "443"   on;
}

इसका मतलब है कि हमारे पास ज्ञान होगा कि वास्तविक ग्राहक प्रोटोकॉल क्या है। जैसा कि आप देख सकते हैं, हमारे पास यह $switchvar में होगा। और इस समय आप इसका उपयोग उन सभी स्थानों पर करते हैं जहाँ आपको इसकी आवश्यकता है:

location ~ /softwareapi/index.php {
  fastcgi_param HTTPS $switch;
  .. other settings here ..
}

HTTPS सेटिंग के साथ php एप्लिकेशन स्वचालित रूप से सही प्रोटोकॉल का पता लगाएगा और मिश्रित सामग्री मुद्दे को रोकने के लिए सावधानीपूर्वक सापेक्ष पथ का निर्माण करेगा।

सादर।


3

@ उली के उत्तर के आधार पर यदि आप इसे टेराफॉर्म का उपयोग करके कॉन्फ़िगर करना चाहते हैं , तो यहां एक उदाहरण है>

resource "aws_alb_listener" "web" {
  load_balancer_arn = "${aws_alb.web.arn}"

  port              = "80"
  protocol          = "HTTP"

  default_action {
    type = "redirect"

    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}

स्रोत


-2

.ebextensions/00_forward_http_to_https.configनिम्नलिखित सामग्री के साथ एक फ़ाइल बनाएँ :

files: 
  /tmp/deployment/http_redirect.sh:
    mode: "000755"
    content: |
      APP_URL=`/opt/elasticbeanstalk/bin/get-config environment --output yaml | grep -oP 'APP_URL: \K([^\s)\"](?!ttp:))+'`
      sed -ie 's@$proxy_add_x_forwarded_for;@$proxy_add_x_forwarded_for;\n        if ($http_x_forwarded_proto = 'http') { return 301 https://'"$APP_URL"'$request_uri; }@' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf

container_commands:
  http_redirect:
    command: "/tmp/deployment/http_redirect.sh"

पहले से ही AWS प्रबंधन कंसोल से APP_URL पर्यावरण चर सेट करना सुनिश्चित करें।


ईएलबी के साथ टीसीपी कनेक्शन को संतुलित करते समय मैं यह कैसे कर सकता हूं?
बूम

1
मैं यह नहीं देखता कि आपका उत्तर प्रश्न पर कहाँ फिट बैठता है ... आप लोचदार बीन के डंठल के बारे में बात कर रहे हैं और यह प्रश्न EC2 के अंदर nginx के बारे में है।
जवारदास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.