400 nginx से निपटने "सादे HTTP अनुरोध HTTPS पोर्ट के लिए भेजा गया था" त्रुटि


115

मैं यात्री / nginx के पीछे एक सिनात्रा ऐप चला रहा हूं। मैं इसे http और https दोनों कॉल का जवाब देने की कोशिश कर रहा हूं। समस्या यह है, जब सर्वर ब्लॉक में दोनों को परिभाषित किया जाता है तो https कॉल को सामान्य रूप से जवाब दिया जाता है, लेकिन http एक 400 "सादे HTTP अनुरोध HTTPS पोर्ट में भेजा गया था" त्रुटि। यह एक स्थिर पृष्ठ के लिए है, इसलिए मैं अनुमान लगा रहा हूं कि सिनात्रा का इससे कोई लेना-देना नहीं है। कोई राय कि इसे कैसे ठीक किया जाए?

यहाँ सर्वर ब्लॉक है:

server {
        listen 80;
        listen 443  ssl;
        server_name localhost;
        root /home/myhome/app/public;
        passenger_enabled on;

        ssl on;
        ssl_certificate      /opt/nginx/ssl_keys/ssl.crt;
        ssl_certificate_key  /opt/nginx/ssl_keys/ssl.key;
        ssl_protocols        SSLv3 TLSv1;
        ssl_ciphers          HIGH:!aNULL:!MD5;

        location /static {
            root  /home/myhome/app/public;
            index  index.html index.htm index.php;
        }

        error_page 404 /404.html;

        # redirect server error pages to the static page /50x.html
        error_page 500 /500.html;

        access_log /home/myhome/app/logs/access.log;
        error_log /home/myhome/app/logs/error.log;
}

मेरे मामले में यह था कि ब्राउज़र में यूआरएल: my.example.com:443काम नहीं किया। बदले कि https://my.example.comकाम किया। अजीब, अपाचे के साथ यह समस्या कभी नहीं थी।
सेबस्टियन

1
ssl on;SSL के माध्यम से किसी भी सामग्री को सर्वर पर NGINX बताता है । यदि आपका सर्वर http और https दोनों ट्रैफ़िक डिलीवर करता है, और निर्देश निकालता है, तो अपने listen 443;उदाहरण के अंत में "ssl" ध्वज का उपयोग करें । listen 443 ssl;ssl on;
स्टीफन

जवाबों:


195

मैं एक ऐसी ही समस्या में भाग गया। यह एक सर्वर पर काम करता है और एक ही Nginx कॉन्फ़िगरेशन के साथ दूसरे सर्वर पर नहीं है। इसका हल मिला जो इगोर द्वारा यहाँ पर दिया गया है http://forum.nginx.org/read.php?2,1612,1627#msg-1627

हाँ। या आप एक सर्वर में एसएसएल / गैर-एसएसएल सर्वर को जोड़ सकते हैं:

server {
  listen 80;
  listen 443 default ssl;

  # ssl on   - remember to comment this out

}

रापाम इओसिफ के अनुसार, सुनिश्चित करें कि आप भी शामिल हैंssl off;
aceofspades

20
आपको केवल लाइन हटाने की ssl on;जरूरत है (ssl off जोड़ने की आवश्यकता नहीं है)। इसके अलावा, चूंकि मुझे याद नहीं है कि कौन सा नग्नेक्स संस्करण है, इसलिए लाइन defaultपर उपयोग करने की अधिक आवश्यकता नहीं है listen 443। तो ओपी विन्यास ठीक था, केवल हटाने की जरूरत है ssl onऔर यह काम करना चाहिए।
laurent

@bobojam मेरे उत्तर से स्पष्टीकरण को शामिल करने के लिए स्वतंत्र महसूस करता है, ताकि आपका और अधिक पूरा हो जाए। मैंने ओपी लेखक से आपको जवाब स्वीकार करने के लिए कहा है।
अलेक्जेंडर अजरोव

2
यह टिप्पणी करके SSL उद्देश्य को कैसे हल करता है ssl on। @ MichaelJ.Evans जवाब नीचे एक बेहतर समाधान है।
नील

1
लगता है कई गोपनीय फ़ाइलों के साथ काम करने के लिए नहीं है। कहते हैं, 2 डुप्लिकेट डिफ़ॉल्ट हैं। सिकंदर के समाधान का उपयोग करें।
रयाल

39

उपरोक्त उत्तर गलत हैं कि अधिकांश ओवर-राइड answers यह कनेक्शन HTTPS ’टेस्ट है, जो कनेक्शन सुरक्षा की परवाह किए बिना http पर पृष्ठों की सेवा करने की अनुमति देता है।

NGINX विशिष्ट http 4xx त्रुटि कोड पर एक त्रुटि-पृष्ठ का उपयोग करके सुरक्षित उत्तर क्लाइंट को उसी अनुरोध को पुनः प्राप्त करने के लिए पुनः निर्देशित करने के लिए पुनर्निर्देशित करता है। (जैसा कि यहां बताया गया है /server/338700/redirect-http-mydomain-com12345-to-https-mydomain-com12345-in-nginx )

ओपी का उपयोग करना चाहिए:

server {
  listen        12345;
  server_name   php.myadmin.com;

  root         /var/www/php;

  ssl           on;

  # If they come here using HTTP, bounce them to the correct scheme
  error_page 497 https://$host:$server_port$request_uri;

  [....]
}

1
आप शायद $ host के बजाय $ server_name चाहते हैं, सर्वर_name संभवतः CN पर सेट किया जा रहा है जो SSL प्रमाणित करता है। इस तरह, अगर आईपी या लोकलहोस्ट के जरिए आया तो यूजर को डराने वाली स्क्रीन नहीं मिलेगी।
जॉर्ज

मैं इसे GitLab के अपने स्थानीय इंस्टॉलेशन पर लागू करने की कोशिश कर रहा था , लेकिन GitLab सर्वर ब्लॉक विधि में इनसेटिंग कस्टम NGINX सेटिंग का उपयोग किया, इस प्रकार nginx['custom_gitlab_server_config'] = "error_page 497 https://$host:$server_port$request_uri;"यह चाल चली
हारून C

17

त्रुटि वास्तव में यह सब कहती है। आपका कॉन्फ़िगरेशन पोर्ट 80 (HTTP) पर सुनने और SSL का उपयोग करने के लिए Nginx को बताता है। जब आप अपने ब्राउज़र को इंगित करते हैं http://localhost, तो यह HTTP के माध्यम से जुड़ने की कोशिश करता है। चूंकि Nginx SSL की अपेक्षा करता है, यह त्रुटि के साथ शिकायत करता है।

वर्कअराउंड बहुत सरल है। आपको दो serverसेक्शन चाहिए:

server {
  listen 80;

  // other directives...
}

server {
  listen 443;

  ssl on;
  // SSL directives...

  // other directives...
}

7
आपको वास्तव में दो सर्वर अनुभागों की आवश्यकता नहीं है। "Ssl on" लाइन को हटा दें और @ bobojam के उत्तर के अनुसार सुनने की लाइनें बदलें।
टॉक्सिक

12

मेरे पास एक ही मुद्दा था, मेरे पास आपकी छूट के समान कॉन्फ़िगरेशन है और मैंने इसे लाइन को हटाकर काम किया है:

ssl on;

डॉक्टर को उद्धृत करने के लिए:

यदि HTTP और HTTPS सर्वर बराबर हैं, तो एक एकल सर्वर जो HTTP और HTTPS दोनों अनुरोधों को संभालता है, को निर्देश "ssl" को हटाकर और ssl पैरामीटर को *: 443 पोर्ट में जोड़कर कॉन्फ़िगर किया जा सकता है।


1
किसी भी मौका आपके पास डॉक्टर के लिए लिंक है?
एडम पार्किन

12

स्थिति कोड पर विकिपीडिया लेख के अनुसार । Http ट्रैफ़िक को https पोर्ट (त्रुटि कोड 497) भेजे जाने पर Nginx का एक कस्टम त्रुटि कोड है

और error_page पर nginx डॉक्स के अनुसार , आप एक URI को परिभाषित कर सकते हैं जो एक विशिष्ट त्रुटि के लिए दिखाया जाएगा।
इस प्रकार हम एक uri बना सकते हैं जो क्लाइंट्स को भेजा जाएगा जब एरर कोड 497 उठाया जाएगा।

nginx.conf

#lets assume your IP address is 89.89.89.89 and also 
#that you want nginx to listen on port 7000 and your app is running on port 3000

server {
    listen 7000 ssl;
 
    ssl_certificate /path/to/ssl_certificate.cer;
    ssl_certificate_key /path/to/ssl_certificate_key.key;
    ssl_client_certificate /path/to/ssl_client_certificate.cer;

    error_page 497 301 =307 https://89.89.89.89:7000$request_uri;

    location / {
        proxy_pass http://89.89.89.89:3000/;

        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Protocol $scheme;
    }
}

हालाँकि यदि कोई ग्राहक GET को छोड़कर किसी अन्य विधि के माध्यम से अनुरोध करता है, तो वह अनुरोध GET में बदल जाएगा। इस प्रकार ग्राहक उस अनुरोध विधि को संरक्षित करता है जिसमें ग्राहक आया था; हम एरर प्रोसेसिंग रिडायरेक्ट्स का उपयोग करते हैं जैसा कि एरर_पेज पर नगनेक्स डॉक्स में दिखाया गया है

और यही कारण है कि हम 301 =307रीडायरेक्ट का उपयोग करते हैं ।

यहाँ दिखाए गए nginx.conf फ़ाइल का उपयोग करके, हम उसी पोर्ट पर http और https सुनने में सक्षम हैं


यह मेरे लिए काम करता है - error_page 497 301 = 307 89.89.89.89:7000 Worequest_uri ;
अकलि शीतल

7

यहां HTTP और HTTPS को उसी कॉन्फ़िगरेशन ब्लॉक में ipv6 सपोर्ट से कॉन्फ़िगर करने का एक उदाहरण है । कॉन्फ़िगरेशन का परीक्षण Ubuntu सर्वर और NGINX / 1.4.6 में किया जाता है लेकिन इसे सभी सर्वरों के साथ काम करना चाहिए।

server {
    # support http and ipv6
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    # support https and ipv6
    listen 443 default_server ssl;
    listen [::]:443 ipv6only=on default_server ssl;

    # path to web directory
    root /path/to/example.com;
    index index.html index.htm;

    # domain or subdomain
    server_name example.com www.example.com;

    # ssl certificate
    ssl_certificate /path/to/certs/example_com-bundle.crt;
    ssl_certificate_key /path/to/certs/example_com.key;

    ssl_session_timeout 5m;

    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
    ssl_prefer_server_ciphers on;
}

ssl onजिसमें 400त्रुटि हो सकती है उसे शामिल न करें । ऊपर दिए गए कॉन्फ़िगरेशन के लिए काम करना चाहिए

http://example.com

http://www.example.com

https://example.com

https://www.example.com

उम्मीद है की यह मदद करेगा!



4

वास्तव में आप इसके साथ कर सकते हैं:

ssl off; 

यह nginxvhosts का उपयोग करने में मेरी समस्या हल हो गई; अब मैं एसएसएल और सादे HTTP दोनों का उपयोग करने में सक्षम हूं। संयुक्त बंदरगाहों के साथ भी काम करता है।


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