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


আমার একটি সাবডোমেনের মতো একটি সাইনআপ পৃষ্ঠা আছে: https://signup.example.com

এটি কেবল HTTPS এর মাধ্যমে অ্যাক্সেসযোগ্য হওয়া উচিত তবে আমি চিন্তিত যে লোকেরা হঠাৎ HTTP এর মাধ্যমে এটির উপর ঝাপসা পড়তে পারে এবং 404 পেতে পারে।

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

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 ? (FYI আমি জানি যে Rails প্লাগইন আছে জোর করতে পারেন SSL কিন্তু যে এড়াতে প্রত্যাশী ছিল)


210
2018-03-22 18:45


উত্স


সম্ভাব্য সদৃশ Nginx ইন, সাব ডোমেইন বজায় রাখার সময় আমি কিভাবে সব HTTP অনুরোধ https লিখতে পারি? - Nasreddine


উত্তর:


অনুসারে nginx pitfalls, এটা ব্যবহার অপ্রয়োজনীয় ক্যাপচার বাদ দিতে একটু ভাল $request_uri পরিবর্তে. যে ক্ষেত্রে, nginx কোনো প্রশ্নের args দ্বিগুণ থেকে প্রতিরোধ করার জন্য একটি প্রশ্ন চিহ্ন যোগ করুন।

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

137
2018-03-22 19:22



অথবা, আপনি সংযুক্ত সাইটের অনুযায়ী, "উত্তম": return 301 http://domain.com$request_uri; - nh2
একটি মন্তব্য. $ সার্ভার_নাম $ প্রথম সার্ভার_নাম পরিবর্তনশীল নির্বাচন করে। সুতরাং আপনার কনফিগারেশনে যদি FQN নাম না থাকে তবে এটি সম্পর্কে সচেতন থাকুন - engineerDave
@ nh2 ডকুমেন্টেশনের অন্য একটি কেস ব্যবহার করার পরে ভুল হচ্ছে return 301... পুনর্লিখন পদ্ধতি আসলে কাজ করে যখন একটি "অনেক পুনর্নির্দেশ" ত্রুটি কারণ। - Mike Bethany
যে এখন "এছাড়াও BAD" হিসাবে নথিভুক্ত করা হয়। @MikeBethany return 301 কাজ করে, যদি না (আমি অনুমান) আপনি এটি ট্রিগার করছি এছাড়াও সঠিক URL গুলির জন্য, উভয় পোর্ট শোনার মাধ্যমে (কনফিগারেশন উদাহরণ। সমস্যাটি ট্রিগার করা: গ্রহণ করুন serverfault.com/a/474345/29689's প্রথম উত্তর এবং যদি বাদ দিতে)। - Blaisorblade
আমি বছর ধরে পরিবর্তন হয়েছে এবং এই অন্যান্য উত্তর ভাল কিনা তা আশ্চর্য: serverfault.com/a/337893/119666 - Ryan


এটা বর্ণিত হিসাবে সবচেয়ে ভাল উপায় অফিসিয়াল কিভাবে-থেকে ব্যবহার করে হয় return নির্দেশ:

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

236
2017-09-03 23:50



সংক্ষিপ্ত উত্তর এবং আমার ক্ষেত্রে পুরোপুরি কাজ - mateusz.fiolka
এটি সাধারণত সুপারিশ করা হয় কারণ এটি একটি প্রদান করে 301 Moved Permanently (আপনার লিঙ্ক স্থায়ীভাবে সরানো হয়েছে) পাশাপাশি পুনরায় লেখার - sgb
এটি সেট না করলেও এটি "অনেকগুলি পুনঃনির্দেশ" ত্রুটির কারণ হিসাবে সেট করে proxy_set_header X-Forwarded-Proto https; - Mike Bethany
@ মাইকবেথানি আপনি সংজ্ঞায়িত করা হয় listen 443; একই ব্লক? - Joe B
এই গ্রহণযোগ্য উত্তর হতে হবে। - sjas


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

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;
    }
}

উপরের সব কিছু, "পুনঃলিখন" বা "যদি ssl_protocol" ইত্যাদি ব্যবহার করে ধীর এবং খারাপ হয়।

এখানে একই, তবে আরও কার্যকর, শুধুমাত্র 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;
}

108
2018-01-31 20:43



মহান, কিছু কাপুরুষ এই প্রশ্নের উত্তর ছাড়াই ভোট দিয়েছেন কেন, যদিও এই উত্তর সঠিক। হয়তো অন্যতম "মন্দ যদি" ​​সংস্কৃতিবিদ। যদি আপনি Nginx ডকুমেন্টেশনটি সম্পর্কে যদি পড়তে বিরক্ত হন, তবে আপনি যদি জানতে পারেন যে IfInNoteEvil, এটি একটি অবস্থান {} প্রেক্ষাপটে এটির মধ্যে কেবলমাত্র ব্যবহার করে, যা আমরা এখানে করি না। আমার উত্তর একেবারে সঠিক কাজ করার সঠিক উপায়! - DELETEDACC
আমি এইটিকে ভোট দিই নি, তবে আমি মনে করতে চাই যে ডিফল্টটি সাম্প্রতিকতম সংস্করণগুলিতে 'ডিফল্ট_সার্ভার' -এ পরিবর্তিত হয়েছে। - spuder
প্রথম সমাধানটি সবচেয়ে কার্যকরী নাও হতে পারে, যদি দ্বিতীয়টি আরও কার্যকর হয়। এবং আপনি এমনকি বর্ণিত হয়েছেন, কেন আপনি যদি সেখানে কোনও ব্যবহার না করেন: "এটি প্রতি অনুরোধে $ স্কীম পরিবর্তনশীল চেক করতে বাধা দেয়"। Ifs ব্যবহার না করে পয়েন্ট শুধুমাত্র কর্মক্ষমতা সম্পর্কে নয়, কিন্তু ঘোষণামূলক, এবং প্রয়োজনীয় নয়। - pepkin88
যদি +1 ($ স্কীম = http) - Fernando Kosh
অন্য প্রশ্নের উত্তর হিসাবে এখানে $ হোস্ট ব্যবহার করা উচিত। - Artem Russakovskii


আপনি যদি নতুন দ্বৈত HTTP এবং HTTPS সার্ভারের সংজ্ঞা ব্যবহার করেন তবে আপনি নিম্নলিখিতগুলি ব্যবহার করতে পারেন:

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;
    }
}

এই আমার জন্য কাজ বলে মনে হচ্ছে এবং পুনঃনির্দেশ loops কারণ না।

সম্পাদনা:

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

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

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


56
2017-08-08 11:12



@ ডেভিডপ্যাশলি আপনার সমাধান আমার জন্য একটি কবজ মত কাজ। ধন্যবাদ - Jayesh Gopalan
If you are using the new dual HTTP and HTTPS server definition তারপর আপনি এটা আলাদা করা উচিত। - VBart
মার্জিত এবং নিখুঁত কাজ করে! - jipipayo
এই আমার সমাধান ছিল আমার Laravel / Homestead Nginx কনফিগারেশন সঙ্গে আমার জন্য কাজ। - Jared Eitnier
এছাড়াও পুনর্লিখন লাইন হতে কর্তব্য return 301 https://$server_name$request_uri; এই হিসাবে পছন্দসই পদ্ধতি। - Jared Eitnier


এখনো আরেকটি রূপ, যা হোস্ট সংরক্ষণ করে: অনুরোধ শিরোনাম এবং "ভাল" উদাহরণ অনুসরণ করে nginx pitfalls:

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

27
2018-04-11 12:20



Note that using $server_name instead of $host would always redirect to https://site1 যে কি না $request_uri জন্য? - Jürgen Paul
$request_uri একটি হোস্ট বা ডোমেইন নাম ধারণ করে না। অন্য কথায়, এটি সর্বদা একটি "/" চরিত্র দিয়ে শুরু হয়। - Peter
দূরে দ্বারা সেরা উত্তর। - Ashesh
আমি এই উত্তর কেন এত কম ভোট নিশ্চিত নই। এটা ব্যবহার করে শুধুমাত্র এক। - zopieux
কান্ট বিশ্বাস করে যে অনেক লোক $ server_name ব্যবহার করে এটি করার সঠিক উপায় - Greg Ennis


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


3
2018-03-23 00:40





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;
}

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


1
2017-08-23 19:40



rewrite ^ https://$host$request_uri? permanent;  আপনি একটি vhost উপর সার্ভার নাম থাকতে পারে হিসাবে একটি ভাল সমাধান হবে


আমি এই সবচেয়ে সহজ সমাধান মনে হয়। শুধুমাত্র HTTPS এবং www উভয় অ-HTTPS এবং অ-WWW ট্র্যাফিককে বাধ্য করে।

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;
    }
}

সম্পাদন করুন - এপ্রিল ২0188: সমাধানটি এখানে আমার পোস্টে পাওয়া যেতে পারে: https://stackoverflow.com/a/36777526/6076984


0
2018-04-21 18:30



যদি nginx বিশ্বের মন্দ এবং অক্ষম বলে মনে হয় না? - PKHunter
হ্যাঁ তারা সাধারণভাবে হয়। কিন্তু এই সহজ চেক আমি অনুমান করবে না। আমার কাছে সঠিক কনফিগারেশন ফাইল রয়েছে যা যদিও আরো কোড লেখার সাথে জড়িত থাকে তবে আইএফ এর সম্পূর্ণরূপে এড়ানো যায়। - stamster
Google 303 এর পরিবর্তে 301 ব্যবহার করার পরামর্শ দেয়। উত্স: support.google.com/webmasters/answer/6073543?hl=en - dylanh724
@ ডিলানহান্ট - আমি শুধুমাত্র 303 টি পরীক্ষার জন্য রেখেছি, একটি নোট নিন যে প্রথম হ্যান্ডলারটি 301 তে সেট করা হয়েছিল, শুধুমাত্র ২ য় আমি পরিবর্তন করতে ভুলে গেছি :) এছাড়াও, সমাধান w / o IF এর: stackoverflow.com/a/36777526/6076984 - stamster