Nginx 400 এর সাথে লেনদেন করা হয়েছে "এইচটিটিপিএস পোর্টে সাধারণ HTTP অনুরোধ প্রেরণ করা হয়েছিল" ত্রুটি


115

আমি যাত্রী / এনগিনেক্সের পিছনে একটি সিনাত্রা অ্যাপ চালাচ্ছি। আমি এটি উভয়ই 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কাজ করে। অদ্ভুত, এপাচে কখনও সমস্যা হয়নি had
সেবাস্তিয়ান

1
ssl on;এনজিআইএনএক্সকে এসএসএল এর মাধ্যমে যে কোনও বিষয়বস্তু সার্ভার করতে বলে । আপনার listen 443;উদাহরণস্বরূপ শেষে "এসএসএল" পতাকাটি ব্যবহার করুন listen 443 ssl;যদি আপনার সার্ভারটি HTTP এবং https উভয় ট্র্যাফিক সরবরাহ করে এবং 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;
থাকবেন

20
আপনার কেবল লাইনটি সরিয়ে ফেলতে হবে ssl on;(এসএসএল বন্ধ করার দরকার নেই)। এছাড়াও, যেহেতু আমি কোন এনগিনেক্স সংস্করণ মনে রাখছি না, তাই লাইনে আর ব্যবহার defaultকরার দরকার নেই listen 443। সুতরাং ওপি কনফিগারেশন ঠিক ছিল, কেবল অপসারণ করা দরকার ssl onএবং এটি কাজ করা উচিত।
লরেন্ট

@ ববোজম আমার উত্তর থেকে ব্যাখ্যাটি নির্দ্বিধায় অবিচ্ছিন্ন অনুভব করুন, যাতে আপনার আরও সম্পূর্ণ হয়ে উঠতে পারে। আমি ওপি লেখককে আপনার উত্তরটি মেনে নিতে বলেছি।
আলেকজান্ডার আজারভ

2
কিভাবে এটি মন্তব্য করে SSL এর উদ্দেশ্য সমাধান নেই ssl on। নীচের @ মাইকেল জে.এভান্স উত্তরগুলি আরও ভাল সমাধান।
নীল

1
একাধিক কনফারেন্স ফাইল নিয়ে কাজ করছে বলে মনে হচ্ছে না। বলে 2 টি সদৃশ ডিফল্ট আছে। আলেকজান্ডারের দ্রবণটি ব্যবহার করুন।
রাইল

39

উপরের উত্তরগুলি ভুল যে সংযোগ সুরক্ষা নির্বিশেষে http- র পৃষ্ঠাগুলি পরিবেশন করার অনুমতি দেওয়ার জন্য 'এই সংযোগটি এইচটিটিপিএস' পরীক্ষায় বেশিরভাগ ওভার রাইডে ভুল।

একই অনুরোধটি https এ পুনরায় চেষ্টা করার জন্য ক্লায়েন্টকে পুনর্নির্দেশের জন্য একটি এনজিআইএনএক্স নির্দিষ্ট 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
আপনি সম্ভবত $ হোস্টের পরিবর্তে $ সার্ভার_নাম চান, সার্ভার_নাম সম্ভবত সিএন-তে সেট করা যা এসএসএল শংসাপত্র প্রমাণীকরণ করে। এইভাবে, ব্যবহারকারী যদি কোনও আইপি বা লোকালহোস্টের মাধ্যমে আসে তবে তারা কোনও ভীতি প্রদর্শন করবে না।
জর্জ

আমি ইনস্টল আমার স্থানীয় এই বাস্তবায়ন করার চেষ্টা ছিল GitLab কিন্তু ব্যবহৃত GitLab সার্ভার ব্লক মধ্যে ঢোকাতে কাস্টম nginx সেটিংস পদ্ধতি এইভাবে nginx['custom_gitlab_server_config'] = "error_page 497 https://$host:$server_port$request_uri;"কৌতুক করেনি
হারুন সি

17

ত্রুটিটি আসলে এটি সব বলে। আপনার কনফিগারেশনটি Nginx কে পোর্ট 80 (HTTP) শুনতে এবং SSL ব্যবহার করতে বলে to আপনি যখন আপনার ব্রাউজারটি নির্দেশ করেনhttp://localhost , এটি HTTP- র মাধ্যমে সংযোগ স্থাপনের চেষ্টা করে। যেহেতু এনগিনেক্স এসএসএল প্রত্যাশা করে তাই এটি ত্রুটির সাথে অভিযোগ করে।

কাজটি খুব সহজ very আপনার দুটি serverবিভাগ দরকার :

server {
  listen 80;

  // other directives...
}

server {
  listen 443;

  ssl on;
  // SSL directives...

  // other directives...
}

7
আপনার আসলে দুটি সার্ভার বিভাগের দরকার নেই। "এসএসএল অন" লাইনটি সরান এবং @ বোজোজমের উত্তর অনুসারে শোনার লাইনগুলি পরিবর্তন করুন।
toxaq

12

আমার ঠিক একই সমস্যা ছিল, আপনার উদাহরণ হিসাবে আমার মতো একই কনফিগারেশন রয়েছে এবং আমি লাইনটি সরিয়ে এটির কাজ করেছি:

ssl on;

দস্তাবেজের উদ্ধৃতি দিতে:

যদি এইচটিটিপি এবং এইচটিটিপিএস সার্ভারগুলি সমান হয় তবে এইচটিটিপি এবং এইচটিটিপিএস উভয় অনুরোধকে পরিচালনা করে এমন একক সার্ভারটি "এসএসএল অন" নির্দেশকে মুছে ফেলে এবং *: 443 পোর্টের জন্য এসএসএল প্যারামিটার যুক্ত করে কনফিগার করা যেতে পারে


1
কোনও সুযোগ কি আপনার ডকের লিঙ্ক আছে?
অ্যাডাম পার্কিন

12

স্থিতি কোড উইকিপিডিয়া নিবন্ধ অনুযায়ী । Https বন্দরে HT ট্রাফিক প্রেরণ করা হলে এনগিনেক্সের একটি কাস্টম ত্রুটি কোড রয়েছে (ত্রুটি কোড 497)

এবং ত্রুটি_পৃষ্ঠায় এনজিনেক্স ডক্স অনুসারে আপনি একটি ইউআরআই নির্ধারণ করতে পারেন যা নির্দিষ্ট ত্রুটির জন্য দেখানো হবে।
সুতরাং আমরা একটি ইউরি তৈরি করতে পারি যা ত্রুটি কোড 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;
    }
}

তবে যদি কোনও ক্লায়েন্ট কোনও জিইটি ব্যতীত অন্য কোনও পদ্ধতির মাধ্যমে অনুরোধ করে তবে সেই অনুরোধটি জিইটি-তে পরিণত হবে। এইভাবে ক্লায়েন্টের মাধ্যমে আসা অনুরোধ পদ্ধতিটি সংরক্ষণ করার জন্য; যেমনটি দেখানো হয়েছে তেমন ত্রুটি পুনর্নির্দেশগুলি ব্যবহার করি ত্রুটি_পৃষ্ঠাতে এনজিনেক্স ডক্সে করি

এবং কেন আমরা 301 =307পুনর্নির্দেশটি ব্যবহার করি তা জানায় ।

এখানে প্রদর্শিত nginx.conf ফাইলটি ব্যবহার করে, আমরা একই বন্দরে HTTP এবং https শুনতে সক্ষম হয়েছি


এটি আমার জন্য কাজ করে - ত্রুটি_সীমা 497 301 = 307 89.89.89.89:7000$request_uri ;
উগালি নরম

7

এখানে ipv6 সমর্থন সহ একই কনফিগার ব্লকে HTTP এবং HTTPS কনফিগার করার উদাহরণ । কনফিগারেশনটি উবুন্টু সার্ভার এবং এনজিআইএনএক্স / 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 ব্যবহারে আমার সমস্যার সমাধান করেছে; এখন আমি এসএসএল এবং সরল এইচটিটিপি উভয়ই ব্যবহার করতে সক্ষম। এমনকি সম্মিলিত বন্দর দিয়েও কাজ করে।


Nginx / 1.6.3 :) এ আমার জন্য কাজ করে
djthoms
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.