এনজিনেক্সে কীভাবে জোর করে বা এসএসএলে পুনর্নির্দেশ করবেন?


222

সাবডোমেনে আমার সাইনআপ পৃষ্ঠা রয়েছে যেমন: https://signup.example.com

এটি কেবল এইচটিটিপিএসের মাধ্যমে অ্যাক্সেসযোগ্য হওয়া উচিত তবে আমি আশঙ্কা করছি যে কোনওরকমভাবে এইচটিটিপি এর মাধ্যমে লোকেরা হোঁচট খেতে পারে এবং একটি 404 পেতে পারে।

আমার এইচটিএমএল / সার্ভার ব্লক এনজিনেক্সে এর মতো দেখাচ্ছে:

html {
  server {
    listen 443;
    server_name signup.example.com;

    ssl                        on;
    ssl_certificate        /path/to/my/cert;
    ssl_certificate_key  /path/to/my/key;

    ssl_session_timeout 30m;

    location / {
      root /path/to/my/rails/app/public;
      index index.html;
        passenger_enabled on;
    }
  }
}

আমি কী যুক্ত করতে পারি যাতে যে লোকেরা http://signup.example.comপুনঃনির্দেশ করতে যায় https://signup.example.com? (এফওয়াইআই আমি জানি যে এখানে রেল প্লাগইন রয়েছে যে তারা জোর SSLকরতে পারে তবে তা এড়াতে আশা করছিল)


উত্তর:


145

এনজিনেক্সের অসুবিধাগুলি অনুসারে অপ্রয়োজনীয় ক্যাপচার বাদ দিয়ে কিছুটা ভাল $request_uriinstead সেক্ষেত্রে এনগিনেক্সকে কোনও কোয়েরি আরগ দ্বিগুণ করা থেকে রক্ষা করতে একটি প্রশ্ন চিহ্ন যুক্ত করুন end

server {
    listen      80;
    server_name signup.mysite.com;
    rewrite     ^   https://$server_name$request_uri? permanent;
}

68
অথবা, আপনি যে সাইটটি সংযুক্ত করেছেন সে অনুযায়ী "ভাল" :return 301 http://domain.com$request_uri;
এনএইচ 2

13
একটি মন্তব্য. $ সার্ভার_নাম $ প্রথম সার্ভার_নাম ভেরিয়েবলটি তুলে দেয়। সুতরাং আপনার কনফিগারেশনে এফকিউএন নাম না থাকলে এটি সম্পর্কে সচেতন হন
ইঞ্জিনিয়ার

2
@ এনএইচ 2 এটি ডকুমেন্টেশন ভুল হওয়ার অন্য একটি ক্ষেত্রে, যেহেতু return 301...পুনর্লিখন পদ্ধতিটি আসলে কাজ করে যখন "অনেক বেশি পুনর্নির্দেশ" ত্রুটির কারণ হয়।
মাইক বেথনি

1
এটি এখন "এছাড়াও বিএডি" হিসাবে নথিভুক্ত। @MikeBethany return 301যদি না (আমি অনুমান), কাজ করে আপনি এটি triggering করছি এছাড়াও সঠিক URL- এর প্রস্তাবনা (উভয় পোর্ট শোনা কনফিগ উদাহরণ দ্বারা আপনি সমস্যা triggering। নিতে serverfault.com/a/474345/29689's প্রথম উত্তর এবং বর্জন যদি )।
ব্লেজারব্লেড

1
আমি বিস্মিত হয়েছি যে কয়েক বছর ধরে কী পরিবর্তিত হয়েছে এবং এই অন্য উত্তরটি আরও ভাল কিনা: serverfault.com/a/337893/119666
রায়ান

256

নির্দেশিকাটি ব্যবহার করে কীভাবে করা যায় তা কর্মকর্তায় বর্ণিত সর্বোত্তম উপায় return:

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

5
সংক্ষিপ্ত উত্তর এবং আমার ক্ষেত্রে নিখুঁতভাবে কাজ করেছে
mateusz.fiolka

1
এটি সাধারণত সুপারিশ করা হয় কারণ এটি একটি 301 Moved Permanently(আপনার লিঙ্কগুলি স্থায়ীভাবে সরে গেছে) পাশাপাশি
পুনর্বার

1
এটি সেট করে না কারণ এটি আপনি সেট করে থাকলেও "অনেকগুলি পুনর্নির্দেশ" ত্রুটির কারণ ঘটায়proxy_set_header X-Forwarded-Proto https;
মাইক বেথনি

1
@ মাইকবেথানি আপনি কি listen 443;একই ব্লকে সংজ্ঞা দিচ্ছেন ?
জো বি

2
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
sjas

119

আপনি যদি এগুলি সবই একটি সার্ভার ব্লকে রাখতে চান তবে এটি সঠিক এবং সবচেয়ে কার্যকর উপায়:

server {
    listen   80;
    listen   [::]:80;
    listen   443 default_server ssl;

    server_name www.example.com;

    ssl_certificate        /path/to/my/cert;
    ssl_certificate_key  /path/to/my/key;

    if ($scheme = http) {
        return 301 https://$server_name$request_uri;
    }
}

উপরের সমস্ত কিছু, "পুনর্লিখন" বা "যদি এসএসএল_প্রোটোকল" ইত্যাদি ব্যবহার করা ধীর এবং খারাপ।

এখানে কেবল একই, তবে আরও দক্ষ, কেবলমাত্র HTTP প্রোটোকলে পুনর্লিখন চালিয়ে এটি প্রতিটি অনুরোধে $ স্কিমের পরিবর্তনশীল পরীক্ষা করে এড়ানো যায়। তবে সিরিয়াসলি, এটি এমন একটি ছোটখাটো জিনিস যা আপনার এগুলি আলাদা করার দরকার নেই।

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

    server_name www.example.com;

    return 301 https://$server_name$request_uri;
}
server {
    listen   443 default_server ssl;

    server_name www.example.com;

    ssl_certificate        /path/to/my/cert;
    ssl_certificate_key  /path/to/my/key;
}

8
দুর্দান্ত, কিছু উত্তরসূরী কেন এই উত্তরটি সঠিক, যদিও এই উত্তরটি সঠিক না বলেই এই উত্তরটি দিয়েছে। সম্ভবত "আর যদি খারাপ" সংস্কৃতিবিদদের মধ্যে এটির আরেকটি হতে পারে। আপনি যদি ইজি সম্পর্কে এনগিনেক্স ডকুমেন্টেশন পড়তে বিরক্ত করেন তবে আপনি জানতে পারবেন যে যদি আইফআইএনএনটিএভিল, কেবলমাত্র একটি নির্দিষ্ট জায়গায়}} প্রসঙ্গের মধ্যে এর ব্যবহার করে, আমরা এখানে কিছুই করি না। আমার উত্তরটি হ'ল কাজ করার সঠিক উপায়!
মুছে ফেলা 26'13

2
আমি এটিকে ভোট দেইনি, তবে আমি উল্লেখ করতে চাই যে সাম্প্রতিকতম সংস্করণগুলিতে ডিফল্টটি 'ডিফল্ট_সভার' হয়ে গেছে।
spuder

দ্বিতীয় সমাধানটি আরও দক্ষ হলে প্রথম সমাধানটি সবচেয়ে কার্যকর হতে পারে না। এবং আপনি এমনকি বর্ণনা করেছেন, কেন সেখানে যদি আপনার ব্যবহার না করা হয়: "এটি প্রতিটি অনুরোধে $ স্কিমের পরিবর্তনশীল পরীক্ষা করা" এড়ায় "। আইএফএস ব্যবহার না করার বিষয়টি কেবল পারফরম্যান্স সম্পর্কে নয়, এটি ঘোষণামূলক এবং প্রয়োজনীয়ও নয়।
pepkin88

যদি এর জন্য +1 ($ স্কিম = http)
ফার্নান্দো কোশ

অন্যান্য উত্তরে উল্লিখিত হিসাবে এখানে $ হোস্ট ব্যবহার করা উচিত।
আর্টেম রাশাকোভস্কিই

56

আপনি যদি নতুন ডুয়াল এইচটিটিপি এবং এইচটিটিপিএস সার্ভার সংজ্ঞা ব্যবহার করে থাকেন তবে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

server {
    listen   80;
    listen   [::]:80;
    listen   443 default ssl;

    server_name www.example.com;

    ssl_certificate        /path/to/my/cert;
    ssl_certificate_key  /path/to/my/key;

    if ($ssl_protocol = "") {
       rewrite ^   https://$server_name$request_uri? permanent;
    }
}

এটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে এবং লুপগুলি পুনর্নির্দেশের কারণ নয়।

সম্পাদনা:

প্রতিস্থাপিত:

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

প্রতীকের পুনর্লিখনের লাইনের সাথে।


2
@ ডেভিডপ্যাশলে আপনার সলিউশনটি আমার জন্য আকর্ষণীয় কাজ করেছে। ধন্যবাদ
জয়েশ গোপালান

1
If you are using the new dual HTTP and HTTPS server definitionতাহলে আপনার এটি আলাদা করা উচিত।
ভিবার্ট

2
মার্জিত এবং নিখুঁত কাজ করে!
জ্যাকট্রেড

2
এটি ছিল আমার একমাত্র সমাধান যা আমার লারাভেল / হোমস্টেড এনগিনেক্স কনফিগারেশন নিয়ে কাজ করেছিল।
জ্যারেড আইটনিয়ার

1
পুনর্লিখনের রেখাটি হওয়া উচিত return 301 https://$server_name$request_uri;কারণ এটি পছন্দসই পদ্ধতি।
জেরেদ আইটনিয়ার

27

তবুও অন্য একটি রূপ, যা হোস্টটি সংরক্ষণ করে: শিরোনামের অনুরোধ করে এবং এনজিঙ্কস সংক্রান্ত সমস্যার উপর "ভাল" উদাহরণ অনুসরণ করে :

server {
    listen   10.0.0.134:80 default_server;

    server_name  site1;
    server_name  site2;
    server_name  10.0.0.134;

    return 301 https://$host$request_uri;
}

ফলাফল এখানে। মনে রাখবেন $server_nameপরিবর্তে ব্যবহার করা $hostসর্বদা পুনঃনির্দেশিত হবে https://site1

# curl -Is http://site1/ | grep Location
Location: https://site1/

# curl -Is http://site2/ | grep Location
Location: https://site2/


# curl -Is http://site1/foo/bar | grep Location
Location: https://site1/foo/bar

# curl -Is http://site1/foo/bar?baz=qux | grep Location
Location: https://site1/foo/bar?baz=qux

Note that using $server_name instead of $host would always redirect to https://site1এটা কি $request_uriজন্য না?
জর্জেন পল

2
$request_uriএকটি হোস্ট বা ডোমেন নাম ধারণ করে না। অন্য কথায়, এটি সর্বদা "/" অক্ষর দিয়ে শুরু হয়।
পিটার

2
এখন পর্যন্ত সেরা উত্তর।
আশেশ

3
আমি নিশ্চিত নই কেন এই উত্তরটি ভোটে এত কম। এটি একমাত্র মূল্যবান।
zopieux

2
এত লোক বিশ্বাস করে $ সার্ভার_নামটি এটিই করার সঠিক উপায়
গ্রেগ এনিস

3

আপনি যে কোনও কুকিতে 'সুরক্ষিত' সেট করেছেন তা নিশ্চিত করুন, না হলে সেগুলি HTTP অনুরোধে প্রেরণ করা হবে এবং ফায়ারশিপের মতো কোনও সরঞ্জাম দ্বারা ধরা পড়তে পারে।


1
server {
    listen x.x.x.x:80;

    server_name domain.tld;
    server_name www.domian.tld;
    server_name ipv4.domain.tld;

    rewrite     ^   https://$server_name$request_uri? permanent;
}

এটি আমার মনে হয় আরও ভাল কাজ করে। xxxx আপনার সার্ভারের আইপি বোঝায়। আপনি যদি প্লেস্ক 12 এর সাথে কাজ করছেন তবে আপনি যে কোনও ডোমেইনের জন্য "/var/www/vhosts/system/domain.tld/conf" ডিরেক্টরিতে "nginx.conf" ফাইলটি পরিবর্তন করে এটি করতে পারেন। কনফিগারেশনটি সংরক্ষণ করার পরে এনগিনেক্স পরিষেবা পুনরায় চালু করতে ভুলবেন না।


rewrite ^ https://$host$request_uri? permanent; আরও ভাল সমাধান হতে পারে কারণ আপনার

0

আমি মনে করি এটিই সবচেয়ে সহজ সমাধান simple কেবল এইচটিটিপিএস এবং ডাব্লুএইচটিপিএস এবং নন-ডাব্লুডাব্লুডাব্লু ট্র্যাফিক জোর করে।

server {
    listen 80;
    listen 443 ssl;

    server_name domain.tld www.domain.tld;

    # global HTTP handler
    if ($scheme = http) {
        return 301 https://www.domain.tld$request_uri;
    }

    # global non-WWW HTTPS handler
    if ($http_host = domain.tld) {
        return 303 https://www.domain.tld$request_uri;
    }
}

সম্পাদনা - এপ্রিল 2018: সমাধান ডাব্লু / ও আইএফ এর পোস্টটি এখানে পাওয়া যাবে: https://stackoverflow.com/a/36777526/6076984


1
যদি পরিস্থিতিগুলি এনজিন্স বিশ্বে মন্দ এবং অদক্ষ বিবেচিত হয় না?
PKHunter

হ্যাঁ তারা সাধারণভাবে তবে এই সাধারণ চেকগুলির জন্য আমি অনুমান করব না। আমার কাছে একটি সঠিক কনফিগারেশন ফাইল রয়েছে যা আরও বেশি কোড রচনার সাথে জড়িত তবে আইএফ এর সম্পূর্ণরূপে এড়িয়ে চলে।
স্ট্যামস্টার

গুগল 303 এর পরিবর্তে 301 ব্যবহার করার পরামর্শ দেয় Source উত্স: সমর্থন.
google.com/webmasters/answer/6073543?hl=en

@DylanHunt - আমি শুধুমাত্র পরীক্ষার 303 বাম, একটি নোট যে 1 ম হ্যান্ডলার 301 সেট ছিল নেওয়া, শুধুমাত্র 2nd আমি পরিবর্তন করতে :) এছাড়াও, W / যদি ণ এর সমাধান ভুলে গেছি: stackoverflow.com/a/36777526/6076984
stamster
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.