फिक्स " सादे HTTP अनुरोध को HTTPS पोर्ट " Nginx में त्रुटि


इस लेख में, हम दिखाएंगे कि " 400 बैड रिक्वेस्ट: हल करने के लिए सादा एचटीटीपी अनुरोध एचटीटीपीएस पोर्ट " को नगनेक्स HTTP सर्वर में कैसे भेजा गया था। जब आप HTTP और HTTPS अनुरोधों को संभालने के लिए Nginx को कॉन्फ़िगर करने का प्रयास करते हैं तो यह त्रुटि सामान्य रूप से उत्पन्न होती है।

इस गाइड के उद्देश्य के लिए, हम एक ऐसे परिदृश्य पर विचार कर रहे हैं जिसमें nginx सर्वर ब्लॉक (या अपाचे में वर्चुअल होस्ट) के माध्यम से कार्यान्वित कई वेबसाइटों की सेवा कर रहा है केवल एक वेबसाइट एसएसएल का उपयोग करती है और बाकी नहीं करती है।

हम नीचे दिए गए नमूना SSL कॉन्फ़िगरेशन पर भी विचार करेंगे (हमने सुरक्षा कारणों के लिए वास्तविक डोमेन नाम बदल दिया है), जो कि nginx को दोनों पोर्ट 80 और 443 सुनने के लिए कहता है। और HTTP पर सभी अनुरोधों को डिफ़ॉल्ट रूप से HTTPS पर पुनर्निर्देशित किया जाना चाहिए।

server{
        listen 80;
        server_name example.com www.example.com;
        return 301 https://www.example.com$request_uri;
}
server {
        listen 443 ssl http2;
        server_name example.com www.example.com;

        root   /var/www/html/example.com/;
        index index.php index.html index.htm;

        #charset koi8-r;
        access_log /var/log/nginx/example.com/example.com_access_log;
        error_log   /var/log/nginx/example.com/example.com_error_log   error;

        # SSL/TLS configs
        ssl on;
        ssl_certificate /etc/ssl/certs/example_com_cert_chain.crt;
        ssl_certificate_key /etc/ssl/private/example_com.key;

        include /etc/nginx/ssl.d/ssl.conf;

        location / {
                try_files $uri $uri/ /index.php?$query_string;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/html/example.com/;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {

                root   /var/www/html/example.com/;
                fastcgi_pass   127.0.0.1:9001;
                #fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include         fastcgi_params;
                include /etc/nginx/fastcgi_params;

        }
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
}

उपरोक्त कॉन्फ़िगरेशन का उपयोग करते हुए, एक बार एक क्लाइंट आपकी साइट को पोर्ट 80 अर्थात <कोड> http://example.com के माध्यम से एक्सेस करने की कोशिश करता है, प्रश्न में त्रुटि निम्नलिखित के रूप में प्रदर्शित होगी। स्क्रीन शॉट।

आप इस त्रुटि का सामना करते हैं क्योंकि हर बार जब कोई क्लेटन आपकी साइट को HTTP के माध्यम से एक्सेस करने की कोशिश करता है, तो अनुरोध HTTPS पर पुनर्निर्देशित किया जाता है। यह इसलिए है क्योंकि nginx लेनदेन में SSL का उपयोग करने की अपेक्षा करता है, फिर भी मूल की आवश्यकता होती है t (पोर्ट 80 के माध्यम से प्राप्त) सादा HTTP था, यह त्रुटि के साथ शिकायत करता है।

दूसरी ओर, यदि कोई ग्राहक https://example.com का उपयोग करता है, तो वे उपरोक्त त्रुटि का सामना नहीं करेंगे। इसके अलावा, यदि आपके पास SSL का उपयोग न करने के लिए कॉन्फ़िगर की गई अन्य वेबसाइटें हैं, तो उपर्युक्त त्रुटि के कारण nginx डिफ़ॉल्ट रूप से HTTPS का उपयोग करने का प्रयास करेगा।

इस त्रुटि को ठीक करने के लिए, अपने कॉन्फ़िगरेशन में नीचे दी गई लाइन पर टिप्पणी करें या इसे बंद पर सेट करें।

#ssl on 
OR
ssl off

फ़ाइल को सहेजें और बंद करें। उसके बाद nginx सेवा को पुनरारंभ करें।

# systemctl restart nginx
OR
$ sudo systemctl restart nginx

इस तरह, आप कई सर्वर ब्लॉकों के लिए HTTP और HTTPS दोनों अनुरोधों को संभालने के लिए nginx को सक्षम कर सकते हैं।

अंत में, सामान्य लिनक्स वितरण और FreeBSD पर SSL HTTPS स्थापित करने के बारे में लेखों की एक सूची है।

  1. Setting Up HTTPS with Let’s Encrypt SSL Certificate For Nginx on RHEL/CentOS
  2. Secure Nginx with Free Let’s Encrypt SSL Certificate on Ubuntu and Debian
  3. How to Secure Nginx with SSL and Let’s Encrypt in FreeBSD

अभी के लिए इतना ही। यदि आप इस त्रुटि को हल करने का कोई अन्य तरीका जानते हैं, तो कृपया नीचे दिए गए फीडबैक फॉर्म के माध्यम से हमें बताएं।