এস-এস-এস-এর মাধ্যমে এনজিএনএক্স-এর সাথে নন-www-কে পুনঃনির্দেশ করুন


25

যখন পুনর্নির্দেশ বের করার চেষ্টা আমি একটি ত্রুটি হচ্ছে https://example.com করার https://www.example.com

আমি যখন https://example.com এ যাই , এটি পুনঃনির্দেশিত হয় না এবং পৃষ্ঠা / 200 স্থিতি ফেরত দেয়।

আমি এটি চাই না, আমি এটি https://www.example.com এ পুনর্নির্দেশ করতে চাই ।

আমি যখন http://example.com এ যাই , এটি https://www.example.com এ পুনঃনির্দেশ করে

কেউ আমাকে বলতে পারে আমি কোথায় ভুল করছি?

এটি আমার ডিফল্ট এবং ডিফল্ট-এসএসএল কনফিগারেশন ফাইলগুলি:

default.conf

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

ডিফল্ট-ssl.conf

upstream app_server_ssl {
    server unix:/tmp/unicorn.sock fail_timeout=0;
}

server {
    server_name example.com;
    return 301 https://www.example.com$request_uri
}
server {
    server_name www.example.com;

    listen 443;
    root /home/app/myproject/current/public;
    index index.html index.htm;

    error_log /srv/www/example.com/logs/error.log info;
    access_log /srv/www/example.com/logs/access.log combined;

    ssl on;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_certificate /srv/www/example.com/keys/ssl.crt;
    ssl_certificate_key /srv/www/example.com/keys/www.example.com.key;
    ssl_ciphers AES128-SHA:RC4-MD5:ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:RSA+3DES:!ADH:!AECDH:!MD5:AES128-SHA;
    ssl_prefer_server_ciphers on;

    client_max_body_size 20M;


    try_files $uri/index.html $uri.html $uri @app;


    # CVE-2013-2028 http://mailman.nginx.org/pipermail/nginx-announce/2013/000112.html
    if ($http_transfer_encoding ~* chunked) {
            return 444;
        }

    location @app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://app_server_ssl;
    }

    error_page 500 502 503 504 /500.html;

    location = /500.html {
        root /home/app/example/current/public;
    }
}

1
2 কনফ ফাইল তৈরি করার বিষয়টি কী?
সন্দীপ সুবেদী

উদ্বেগের বিভাজন, নন এসএসএল কনফিগারেশন এত ছোট ছিল যে এটি কেবলমাত্র এসএসএল কনফিগার থেকে আলাদা করা ভাল বলে মনে হয়েছিল।
থমাস ভি।

উত্তর:


34

আপনি listenফাইলে নির্দেশিকা অনুপস্থিত default-ssl.conf। যোগ listen 443;এই ডিরেক্টিভের মধ্যে

server {
    server_name example.com;
    return 301 https://www.example.com$request_uri;
}

ডিফল্টরূপে, আপনি এই নির্দেশটি বাদ দিলে, এনজিনেক্স ধরে নিন যে আপনি পোর্ট ৮০ এ শুনতে চান Here এখানে এই ডিফল্ট আচরণের ডকুমেন্টেশন


সম্পাদনা করুন: @ টিরোকিলকেনেন-এর মন্তব্যের জন্য ধন্যবাদ Thanks

আপনার ডিফল্ট- ssl.conf এর জন্য সম্পূর্ণ কনফিগারেশন এখানে

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /srv/www/example.com/keys/ssl.crt;
    ssl_certificate_key /srv/www/example.com/keys/www.example.com.key;
    return 301 https://www.example.com$request_uri;
}

সিডিনোট : আপনি এনজিএনএক্স ডকুমেন্টেশনের পরামর্শ হিসাবে ssl on;নির্দেশকে প্রতিস্থাপন করতে পারেন ।listen 443 ssl;


4
আপনারও এই ব্লকে সেটআপ ssl_certificateএবং ssl_certificate_keyনির্দেশনা প্রয়োজন , এবং listen 443 ssl;এটি একটি এসএসএল ভোস্ট হিসাবে ব্যবহার করুন।
তেরো কিলকানেন

বর্তমানের বিষয়বস্তু পোস্ট করুন default-ssl.conf। হতে পারে কিছু টাইপো বা পুনরায় অর্ডার সমস্যার কারণে ঘটেছে।
ম্যাসেগোলেহ

এটি বিব্রতকর: / দোষীটি / etc / nginx / সাইট-সক্ষমিত একটি নকল এনগিনেক্স কনফিগারেশন ছিল, /etc/nginx/sites-enabled/default-ssl.backup ডিফল্ট-এসএসএলে কোনও পুনর্নির্দেশের সাথে হস্তক্ষেপ করছিল। বোকা ত্রুটি।
থমাস ভি।

সুতরাং আমাকে 2
শংসাপত্র জারি

পোর্ট 5007 এ কীভাবে এটি অর্জন করা যায়: উদাহরণ.
com.com:5007

5

কেবলমাত্র যদি একটি বিবৃতিতে ফেলে দিন এবং আপনার পথে চলতে হবে। আমি curl.exe -I এবং https://www.example.com ছাড়াও সমস্ত ক্ষেত্রে ফলাফল পরীক্ষা করে দেখেছি 301 হিসাবে গণ্যঅতএব, আপনি শংসাপত্রের ত্রুটিগুলি পান।

ব্যক্তিগতভাবে, আমি ডোমেন থেকে www গুলি সরিয়ে ফেলা পছন্দ করি তবে আমি আপনার প্রশ্নের উত্তর দেওয়ার জন্য নীচে আমার কোডটি লিখেছি।

server {
listen 443 ssl;
listen [::]:443 ssl; # IPV6

server_name example.com www.example.com; # List all variations here

# If the domain is https://example.com, lets fix it!

if ($host = 'example.com') {
  return 301 https://www.example.com$request_uri;
}

# If the domain is https://www.example.com, it's OK! No changes necessary!

... # SSL .pem stuff
...
}

server {
listen 80;
listen [::]:80;

# If the domain is http://example.com or https://www.example.com, let's change it to https!

server_name example.com www.example.com;
return 310 https://www.example.com$request_uri;
}

3

আমি যেভাবে এটি করি তা হ'ল এসএসএল সার্ভার ব্লকের অভ্যন্তরে যদি একটি বিবৃতি ব্যবহার করা হয় যা www এর https এ পুনঃনির্দেশ করে

ssl_certificate /srv/www/example.com/keys/ssl.crt;
ssl_certificate_key /srv/www/example.com/keys/www.example.com.key;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AES128-SHA:RC4-MD5:ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:RSA+3DES:!ADH:!AECDH:!MD5:AES128-SHA;
ssl_prefer_server_ciphers on;
client_max_body_size 20M;

upstream app_server_ssl {
    server unix:/tmp/unicorn.sock fail_timeout=0;
}

server {
    server_name example.com;
    return 301 https://www.example.com$request_uri
}

server {
    listen 443 default_server ssl;
    server_name www.example.com;

    # redirect https://example.com to https://www.example.com
    # mainly for SEO purposes etc
    #we will use a variable to do that
    set $redirect_var 0;

    if ($host = 'example.com') {
      set $redirect_var 1;
    }
    if ($host = 'www.example.com') {
      set $redirect_var 1;
    }

    if ($redirect_var = 1) {
      return 301 https://www.example.com$request_uri;
    } 

    try_files $uri/index.html $uri.html $uri @app;

    # CVE-2013-2028 http://mailman.nginx.org/pipermail/nginx-announce/2013/000112.html
    if ($http_transfer_encoding ~* chunked) {
            return 444;
        }

    location @app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://app_server_ssl;
    }

    error_page 500 502 503 504 /500.html;

    location = /500.html {
        root /home/app/example/current/public;
    }
}

অবশ্যই, যখনই আপনি একটি এনজিএনএক্স কনফিগারেশন ফাইলে একটি আইও স্টেটমেন্ট ব্যবহার করতে চান; আপনার পড়া উচিত ছিল: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/


শর্তটি if ($host = 'www.example.com')প্রয়োজনীয় নয়।
কার্ল.এস

2

এর 2018 এখন এবং আমি যদি কেউ এর খুব সহজ সমাধানের সন্ধান করে তবে এটিকে একটি পুনর্নবীকরণ শট দিতে পেরেছি।

অপেক্ষাকৃত নতুন আগত হিসাবে আমার এটিকে করা সম্ভব জিনিসগুলি যতটা সম্ভব সহজ করা। মূলত আপনাকে পুনঃনির্দেশিত উভয় ইচ্ছুক http://example.com এবং https://example.com করার HTTPS //: WWW .example.com। এবং আপনি কেবলমাত্র http://example.com পুনর্নির্দেশে সফল হন

এটি বেশ সরল অপারেশন যা কেবলমাত্র দুটি সার্ভার ব্লকের প্রয়োজন (আমি এটি একটি সংক্ষেপে একটি কনফিগার ফাইলে প্রদর্শন করব)

# 1. Server block to redirect all non-www and/or non-https to https://www
server {
    # listen to the standard http port 80
    listen 80; 

    # Now, since you want to route https://example.com to http://www.example.com....
    # you need to get this block to listen on https port 443 as well
    # alternative to defining 'ssl on' is to put it with listen 443
    listen 443 ssl; 

    # define server_name
    server_name example.com *.example.com; 

    # DO NOT (!) forget your ssl certificate and key
    ssl_certificate PATH_TO_YOUR_CRT_FILE;
    ssl_certificate_key PATH_TO_YOUR_KEY_FILE; 

    # permanent redirect
    return 301 https://www.example.com$request_uri;  
    # hard coded example.com for legibility 
}
# end of server block 1. nearly there....

# 2. Server block for the www (primary) domain
# note that this is the block that will ultimately deliver content
server {
    # define your server name
    server_name www.example.com; 

    # this block only cares about https port 443
    listen 443 ssl;

    # DO NOT (!) forget your ssl certificate and key
    ssl_certificate PATH_TO_YOUR_CRT_FILE;
    ssl_certificate_key PATH_TO_YOUR_KEY_FILE; 

    # define your logging .. access , error , and the usual 

    # and of course define your config that actually points to your service
    # i.e. location / { include proxy_params; proxy_pass PATH_TO_SOME_SOCKET; }
}
# End of block 2.
# voilà! 

এখন উভয় http://example.com এবং https://example.com চালনা করা উচিত https://www.example.com । মূলত এই সেটআপটি নন-www এবং / অথবা নন-https- তে https: // www এ সবকিছু পুনঃনির্দেশ করে ।


-1

সমস্ত অনুরোধ পুনর্নির্দেশ করতে https://www.example

আপনার SSL পোর্টে পুনঃনির্দেশ এবং প্রাথমিক ডোমেনের জন্য একটি সার্ভার ব্লক তৈরি করুন (সাধারণত 443) পাশাপাশি ডিফল্ট HTTP পোর্ট 80

# non-www to ssl www redirect
server {
  listen 80; 
  listen 443 ssl;
  server_name example.com;
  return 301 https://www.example.com$request_uri;
  # ... ssl certs
}

# ssl setup for www (primary) domain
server {
  listen 80;
  listen 443 ssl;
  server_name www.example.com;
  if ($scheme = http) {
    return 301 https://www.example.com$request_uri;
  }
  # ... the rest of your config + ssl certs
}

সংরক্ষণ এবং অনুসরণ করুন sudo nginx -s reload

এটি পুনঃনির্দেশিত হবে

http://example      301 -> https://www.example
https://example     301 -> https://www.example
http://www.example  301 -> https://www.example
https://www.example 200

আপনি যদি ক্লফের ;দ্বিতীয় সার্ভার ব্লকে একটি মিস করছেন । এটি হওয়া উচিতreturn 301 https://www.example.com$request_uri;
লুকাশ ওপর্মান

1
যাইহোক, এটি এমনকি কাজ করবে? এটা করতে পারেন শোনার httpউপর 443?
লুকাস ওপর্ম্যান

আপনি ঠিক বলেছেন, আমি শুনছি 80 টি মিস করছি ive এটিকে যুক্ত করেছে
lfender6445
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.