"Www" সরান এবং nginx সহ "https" তে পুনর্নির্দেশ করুন


57

আমি এনজিনেক্সে একটি নিয়ম তৈরি করতে চাই যা দুটি কাজ করে:

  1. "Www।" সরিয়ে দেয়। অনুরোধ ইউআরআই থেকে
  2. অনুরোধ ইউআরআই যদি "HTTP" হয় তবে "https" এ পুনঃনির্দেশ

Individ জিনিসগুলির স্বতন্ত্রভাবে কীভাবে করা যায় তার প্রচুর উদাহরণ রয়েছে, তবে আমি কোনও সমাধান খুঁজে বের করতে পারি না যা উভয়ই সঠিকভাবে করে (যেমন পুনঃনির্দেশ লুপ তৈরি করে না এবং সমস্ত ক্ষেত্রে সঠিকভাবে পরিচালনা করে)।

এটি এই সমস্ত ক্ষেত্রে পরিচালনা করতে হবে:

1. http://www.example.com/path
2. https://www.example.com/path
3. http://example.com/path
4. https://example.com/path

এগুলি লুপিং ছাড়াই https://example.com/path (# 4) এ শেষ হওয়া উচিত । কোন ধারনা?


আমি সবেমাত্র ডিএনএস স্তরে www.mydomain.com কে mydomain.com এ পুনঃনির্দেশিত করেছি এবং এনজিএনএক্সে https- তে নন-https এর জন্য একটি 301 যুক্ত করেছি। দেখে মনে হচ্ছে এটি ঠিক থাকতে হবে ¯ \ _ (ツ) _ / ¯
জোনাথনবেল ২

উত্তর:


94

এটি সম্পাদন করার সর্বোত্তম উপায় হ'ল তিনটি সার্ভার ব্লক ব্যবহার করা: একটি HTTP টি https এ পুনঃনির্দেশ করা, একটি https www- নামটি নো-www তে পুনঃনির্দেশ করা এবং অন্যটি অনুরোধগুলি হ্যান্ডেল করার জন্য। আইএফএসের পরিবর্তে অতিরিক্ত সার্ভার ব্লক ব্যবহার করার কারণ হ্যাশ টেবিল ব্যবহার করে সার্ভার নির্বাচন করা হয় এবং খুব দ্রুত। একটি সার্ভার-স্তর ব্যবহার করে যদি প্রতি অনুরোধের জন্য চালিত হয় তবে এটি অপব্যয়যোগ্য। এছাড়াও, পুনর্লিখনের জন্য অনুরোধ করা ইউরি ক্যাপচার অপব্যয়, কারণ এনজিনেক্স ইতিমধ্যে information uri এবং $ অনুরোধ_উইরি ভেরিয়েবলগুলিতে (যথাক্রমে কোয়েরি স্ট্রিং ছাড়াই এবং সাথে) এই তথ্য রয়েছে has

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

server {
    listen 443 ssl;
    ssl_certificate /path/to/server.cert;
    ssl_certificate_key /path/to/server.key;
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl;
    ssl_certificate /path/to/server.cert;
    ssl_certificate_key /path/to/server.key;
    server_name example.com;

    <locations for processing requests>
}

2
মাঝের ব্লকটি কি প্রয়োজনীয়? প্রথম ব্লকটি ইতিমধ্যে www থেকে নন-ডাব্লু-তে পুনরায় লেখা হচ্ছে না?
pbreitenbach

3
প্রথম ব্লকটি কেবলমাত্র HTTP পরিচালনা করে। মাঝারি ব্লকটি https: // www.example.com/ থেকে https: // উদাহরণ.com/ এ https অনুরোধগুলি পুনর্নির্দেশ করা প্রয়োজন। (অতিরিক্ত জায়গাগুলির জন্য দুঃখিত, আমি এটি অন্যথায় https দেখাতে পারি না)
কলবিজ্যাক

1
কেবল একটি সামান্য বিন্যাসের নোট - আপনি যদি কোনও লিঙ্ক তৈরি করা এড়াতে চান, আপনি ব্যাক-কোটসের ভিতরে মন্তব্য পাঠ্য রাখতে পারেন the এটি টিলডের নিচে one এটির মতো দেখাবে:https://example.com/
সাইক্লপস

9
দ্বিতীয় ব্লকেও শংসাপত্রের তথ্য প্রয়োজন।
রিক্তা

3
এই উত্তরটি চেষ্টা করে, আমি অন্য একটি সমস্যায় পড়লাম। আমি 301 থেকে পুনর্নির্দেশ চিন্তা পারে www.sub.example.comথেকে sub.example.comএবং তারপর শুধুমাত্র একটি SSL সার্টিফিকেট প্রাপ্ত জন্য sub.example.comএখন আমি জানি যে SSL Cert চেক 301 পুনর্নির্দেশ সামনে ঘটে, তাই এটি কাজ করতে পারবে না। এখানে আরও ব্যাখ্যার জন্য: serverfault.com/a/358625/144811
গ্রুজলেস

11

এটি আমার পক্ষে কাজ করে:

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

server {
    listen              443 ssl;
    server_name         www.yourdomain.com;
    ssl_certificate     /path/to/certificate.crt;
    ssl_certificate_key /path/to/private/key.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    return              301 https://yourdomain.com$request_uri;
}

server {
    listen              443 ssl;
    server_name         yourdomain.com;
    ssl_certificate     /path/to/certificate.crt;
    ssl_certificate_key /path/to/private/key.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;

    # do the proper handling of the request
}

উভয় yourdomain.com এবং আপনার এসএসএল শংসাপত্রের মধ্যে www.yourdomain.com অবশ্যই থাকতে হবে তা মনে রাখবেন । ওয়াইল্ডকার্ড শংসাপত্রের মাধ্যমে বা এখানে বর্ণিত সার্ভার বিকল্প নাম দিয়ে এটি সম্ভব । এটি করে এমন সুন্দর এবং নিখরচায় শংসাপত্রগুলির জন্য https://www.startssl.com দেখুন । ( এডিথ : ক্রোম সংস্করণ ৫ 56 থেকে শুরু করে, আর্টসেল শংসাপত্রগুলি আর বিশ্বাসযোগ্য হবে না instead পরিবর্তে https://letsencrypt.org/ চেষ্টা করুন ))


এটি আসলে কাজ করে, তবে আমি ভেবেছিলাম অনেক বেশি সদৃশ কনফিগার লাইন ছাড়াই এটি আরও পরিষ্কার উপায়ে করা যেতে পারে।
zloynemec

@zloynemec আপনি এসএসএল স্টাফগুলিকে একটি পৃথক .conf ফাইলে রাখতে পারেন এবং includeএটিকে এসএসএল সার্ভার ব্লক উভয়ই যুক্ত করতে নিয়মটি ব্যবহার করতে পারেন।
Igettäjä

এছাড়াও আপনি যদি ক্লাউডফ্লেয়ার ব্যবহার করছেন তবে 2 সাবডোমেনগুলি (www + কিছু) পুনঃনির্দেশ এবং প্রক্সি করতে সক্ষম হতে আপনাকে $ 10 / mo সারিট প্রদান করতে হবে। যদি কোনও কর্মসংস্থান থাকে তবে আমাকে জানান।
ফ্রিডো

7

অনুরূপ শত শত মামলার সাথে এত সময় ব্যয় করার পরে, আমি নিম্নলিখিত স্নিপেট নিয়ে এসেছি। এটি সংক্ষিপ্ত এবং সহজেই কোনও কিছু ফিট করার জন্য টুইট করা যেতে পারে।

server {
    listen 80;
    listen 443 ssl;
    server_name example.com www.example.com;
    ssl_certificate /path/to/my/certs/example.com/fullchain.pem;
    ssl_certificate_key /path/to/my/certs/example.com/privkey.pem;

    # Redirect to the correct place, if needed
    set $https_redirect 0;
    if ($server_port = 80) { set $https_redirect 1; }
    if ($host ~ '^www\.') { set $https_redirect 1; }
    if ($https_redirect = 1) {
        return 301 https://example.com$request_uri;
    }

    location / {
    # ...
}

ওহ কিন্তু ifখারাপ !

হ্যাঁ হতে পারে। তবে এটি একটি কারণে উপস্থিত রয়েছে এবং যারা এটি সঠিকভাবে কীভাবে ব্যবহার করতে জানে তাদের কোনও ক্ষতি করা উচিত নয়। ;)


আমি এটি পছন্দ করি তবে আপনার কাছে পারফরম্যান্সের হিট সম্পর্কিত কোনও ডেটা আছে? ধন্যবাদ!
ফ্রিডো

1
সত্যিই আমি কখনই এটি বেঞ্চমার্ক করি নি, তবে আমি বিশ্বাস করি যে পৃথক নিয়মের তুলনায় এর প্রভাব খুব কমই থাকবে কারণ প্রভাবটি প্রায় একই রকম।
এমিলার

পুনর্নির্দেশে বেঞ্চমার্ক? এটা বাস্তব প্রাসঙ্গিক না? (সত্য প্রশ্ন, ট্রল নয় ^^)
ম্যাট্রিক্স

3

আমি প্রতিক্রিয়া কোডটি দিয়ে ফিরে যেতে পছন্দ করি তাই ব্রাউজারটি জানে যে আপনি এটিকে অন্য কোনও ইউআরএলে পুনঃনির্দেশ করছেন।

server {
    listen   80;
    server_name  www.example.com;

    return 301 https://example.com$request_uri;
}

তারপরে অন্য সার্ভার কনফিগারেশনগুলি ব্লক করে https

server {
        listen   443 ssl;
        server_name  example.com;
        ...
    }

0

এই উদ্দেশ্যে কীভাবে সার্ভার ব্লক তৈরি করবেন:

server{
    listen 80;
    server_name www.example.net example.net;
    rewrite ^(.*) https://example.net$1 permanent;
}

তারপরে nginx পুনরায় আরম্ভ করা হচ্ছে


পুনরায় চালু করার সময় আমি একটি "বিবাদী সার্ভারের নাম" ত্রুটি পেয়েছি। এছাড়াও, যে কমান্ড SSL এর জন্য পোর্ট 443 এ শুনবে না এবং আমি পুনঃনির্দেশিত সম্পর্কে চিন্তা করতে হবে https://www.example.comকরতে https://example.comহিসাবে ভাল।
ডেভিন

0

আমি এই কাজ করা উচিত।

আপনার সরল এইচটিটিপি সার্ভার সংজ্ঞাতে অ্যান্থোনাইসোমারসেটের মতো কিছু প্রস্তাবিত, এটি হল:

rewrite ^(.*) https://example.net$1 permanent;

তারপরে আপনার এসএসএল সার্ভারের সংজ্ঞায়:

if ($host ~ /^www\./) {
  rewrite ^(.*) https://example.net$1 permanent;
}

এইভাবে পুনঃনির্দেশটি কেবল একবার অনুরোধ অনুসারে ঘটতে হবে ব্যবহারকারীরা কোন ইউআরএলটি মূলত যায় তা বিবেচনা করে না।


ধন্যবাদ, ধন্যবাদ। if ($host = 'www.example.com') {যদিও আপনার রেজেক্স আমার পক্ষে কাজ করছিল না তাই আমাকে আপনার শর্তসাপেক্ষে পরিবর্তন করতে হয়েছিল। কেন এটি সঠিক দেখাচ্ছে বলে কোনও ধারণা নেই।
ডেভিন 18

মনে রাখবেন যে এটি যদি মন্দ এবং সাধারণত একটি ঘোষিত উপায় ব্যবহার করা ভাল।
ব্লেইস

0

এখানে আমার জন্য কাজ করা সম্পূর্ণ উদাহরণটি। সমস্যাটি ছিল যে আমার ssl_certificateকাছে www পুনর্নির্দেশ ব্লকটিতে এসএসএল বিশদ ( ইত্যাদি) ছিল না। আপনার লগগুলি পরীক্ষা করতে মনে রাখবেন ( sudo tail -f /var/log/nginx/error.log)!

# HTTP — redirect all traffic to HTTPS
server {
    listen 80;
    listen [::]:80 default_server ipv6only=on;
    return 301 https://$host$request_uri;
}

# HTTPS — redirects www to non-www
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name www.example.com;

    # Use the Let's Encrypt certificates
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # Include the SSL configuration from cipherli.st
    include snippets/ssl-params.conf;
    return 301 https://example.com$request_uri;
}

# HTTPS — proxy all requests to the app (port 3001)
server {
    # Enable HTTP/2
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com sub.example.com;

    # Use the Let's Encrypt certificates
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # Include the SSL configuration from cipherli.st
    include snippets/ssl-params.conf;

    # For LetsEncrypt:
    location ~ /.well-known {
        root /var/www/html;
        allow all;
    }

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://localhost:3001;
        proxy_ssl_session_reuse off;
        proxy_set_header Host $http_host;
        proxy_cache_bypass $http_upgrade;
        proxy_redirect off;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.