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


আমি https অনুরোধ হতে আমার ওয়েব সার্ভারে সমস্ত HTTP অনুরোধ পুনর্লিখন করতে চাই, আমি নিম্নলিখিত দিয়ে শুরু করেছি:

সার্ভার {
    শুনতে 80;

    অবস্থান / {
      পুনরায় লিখুন ^ (। *) https: //mysite.com$1 স্থায়ী;
    }
...


এক সমস্যা হল যে এটি কোনও সাবডোমেন তথ্য (উদাহরণস্বরূপ, node1.mysite.com/folder) সরাতে পারে, আমি কীভাবে https এ সবকিছু পুনর্বহাল করতে এবং উপ-ডোমেন বজায় রাখতে উপরে লিখতে পারি?


495
2017-09-21 14:04


উত্স


'গ্রহণযোগ্য উত্তর' সরানো বিবেচনা করুন serverfault.com/a/171238/90758। যে সঠিক এক। - olafure
হার্ডসডেড mysite.com এর পরিবর্তে কেবল $ server_name ব্যবহার করুন - Fedir RYKHTIK


উত্তর:


Nginx এর নতুন সংস্করণে সঠিক উপায়

এই প্রশ্নের আমার প্রথম উত্তরটি নির্দিষ্ট সময়ে সঠিক ছিল তা চালু করুন, তবে এটি অন্য পিঠের মধ্যে পরিণত হয়েছে - আপ টু ডেট থাকার জন্য দয়া করে চেক করুন পুনর্বিবেচনা pitfalls ট্যাক্স

আমি অনেক SE ব্যবহারকারীর দ্বারা সংশোধন করা হয়েছে, তাই ক্রেডিট তাদের কাছে যায়, কিন্তু আরো গুরুত্বপূর্ণভাবে, এখানে সঠিক কোডটি রয়েছে:

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

server {
       listen         443 ssl;
       server_name    my.domain.com;
       # add Strict-Transport-Security to prevent man in the middle attacks
       add_header Strict-Transport-Security "max-age=31536000" always; 

       [....]
}

737
2017-12-05 20:43



ডোমেনের ভিত্তিতে আপনাকে ডোমেইনটিতে এটি করতে হবে - না? আপনি যদি আপনার সার্ভারে প্রতিটি ডোমেনে এটি প্রয়োগ করতে চান তাহলে কী হবে? - JM4
@ জেএম 4: যদি আপনি server_name এর পরিবর্তে পুনর্লিখনে $ হোস্ট $ ব্যবহার করেন এবং শোনা নির্দেশে ডিফল্ট_সারভার যুক্ত করেন তবে এটি আপনার সার্ভারের প্রতিটি ডোমেনের জন্য কাজ করবে। - Klaas van Schelven
এটি উল্লেখ করা গুরুত্বপূর্ণ যে 301 মেয়াদ শেষ হওয়ার পরে আপনার স্থানীয় ক্যাশে সংরক্ষণ করা হয়। কনফিগার পরিবর্তন যখন খুব দরকারী নয় - Trefex
@ সবাইকে POST সামগ্রী সংরক্ষণ করতে 307 টি পুনঃনির্দেশনা ব্যবহার করুন। - Mahmoud Al-Qudsi
আপনি ব্যবহার করতে হবে যে নোট $host পরিবর্তে $server_name যদি আপনি সাবডোমেন ব্যবহার করছেন। - Catfish


দ্রষ্টব্য: এটি করার সর্বোত্তম উপায় সরবরাহ করা হয়েছিল https://serverfault.com/a/401632/3641 - কিন্তু এখানে পুনরাবৃত্তি করা হয়:

server {
    listen         80;
    return 301 https://$host$request_uri;
}

সবচেয়ে সহজ ক্ষেত্রে আপনার হোস্টকে আপনার পরিষেবাটি নির্দিষ্ট করতে নির্দিষ্ট করা হবে - এটি একটি 301 ব্রাউজারে পুনঃনির্দেশিত করবে এবং ব্রাউজার URL সেই অনুসারে আপডেট করবে।

নীচে পূর্ববর্তী উত্তরটি, যা রেজেক্সের কারণে অক্ষম, একটি সহজ 301 টি মহান @ kmindi দ্বারা দেখানো হয়

আমি nginx 0.8.39 এবং উপরে ব্যবহার করা হয়েছে, এবং নিম্নলিখিত ব্যবহার করা হয়েছে:

 server {
       listen 80;
       rewrite ^(.*) https://$host$1 permanent;
 }

ক্লায়েন্ট একটি স্থায়ী পুনঃনির্দেশ পাঠায়।


270
2017-08-17 03:07



আমি মনে করি এটি 80 হতে হবে - এটি HTTP এর জন্য শোনার পরে এবং ক্লায়েন্টটিকে https (443) হিসাবে ফিরে আসতে বলছে। - Michael Neale
এই শীর্ষ উত্তর হতে হবে! - Nathan
এটি সবচেয়ে ট্যাক্সিং উত্তর। - Case
এটি সবচেয়ে সহজতম, কিন্তু কমপক্ষে নিরাপদ - এইভাবে আপনি আপনার সার্ভারটিকে কোনও পৃষ্ঠায় ব্যবহারকারীকে পুনঃনির্দেশিত করতে অনুমতি দিচ্ছেন, এমনকি এটি আপনার সার্ভারে ব্যবহার করার অনুমতি নেই কিনা তা যাচাই না করে। যদি আপনার সার্ভার mydomain.co তে কাজ করে তবে দূষিত ব্যবহারকারীরা এখনও google.com হিসাবে mydomain.co এর অন্যান্য ডোমেনগুলিতে ব্যবহারকারীদের পুনঃনির্দেশিত করতে আপনার সার্ভার ব্যবহার করতে পারে। - friedkiwi
@ cab0lt এখানে কোন নিরাপত্তা সমস্যা নেই। একটি পুনঃনির্দেশ পরিসেবা একটি নিরাপত্তা ঝুঁকি উপস্থিত না। অ্যাক্সেস নিয়ন্ত্রণের প্রয়োজনীয়তা থাকলে, সেই বিন্দুতে যেখানে ব্রাউজারটি নতুন URL টির অনুরোধ করবে সেখানে চেক করা উচিত। ব্রাউজারটি পুনঃনির্দেশের ভিত্তিতে কেবল অ্যাক্সেস লাভ করবে না এবং নতুন URL টির অনুরোধ করার জন্য তাদের পুনঃনির্দেশের প্রয়োজন নেই। - mc0e


আমি মনে করি সর্বোত্তম এবং একমাত্র উপায় ব্যবহার করা উচিত HTTP 301 স্থায়ীভাবে সরানো এই মত পুনঃনির্দেশ:

server {
    listen         [::]:80;
    return 301 https://$host$request_uri;
}

দ্য HTTP 301 স্থায়ীভাবে সরানো ইতিমধ্যে উল্লিখিত অনুযায়ী, মূল্যায়ন করা কোন regex আছে কারণ পুনঃনির্দেশ সবচেয়ে দক্ষ pitfails


নতুন HTTP 308 স্থায়ীভাবে সরানো অনুরোধ পদ্ধতি সংরক্ষণ এবং হয় প্রধান ব্রাউজার দ্বারা সমর্থিত। উদাহরণস্বরূপ, ব্যবহার করে 308 থেকে অনুরোধ পদ্ধতি পরিবর্তন থেকে ব্রাউজার বাধা দেয় POST থেকে GET পুনঃনির্দেশ অনুরোধের জন্য।


যদি তুমি চাও হোস্টনাম এবং সাবডোমেন সংরক্ষণ করুন এটাই উপাই.

এই যদি আপনার কোন DNS থাকে তবে এখনও কাজ করে, আমি স্থানীয়ভাবে এটি ব্যবহার করছি। আমি উদাহরণস্বরূপ অনুরোধ করছি http://192.168.0.100/index.php এবং ঠিক পুনঃনির্দেশিত করা হবে https://192.168.0.100/index.php

আমি ব্যবহার করি listen [::]:80 আমার হোস্ট উপর কারণ আমি আছে bindv6only সেট false, তাই এটি ipv4 সকেট থেকে আবদ্ধ। এটা পরিবর্তন listen 80 যদি আপনি আইপিভি 6 না চান বা অন্য কোথাও বাঁধতে চান।

সাইফ বেকন এর সমাধানটি ব্যবহার করে server_name যা আমার ক্ষেত্রে localhost কিন্তু যে একটি নেটওয়ার্কের উপর নাগালযোগ্য নয়।

মাইকেল নেলের সমাধানটি ভাল, তবে পিটফেল অনুসারে, পুনঃনির্দেশনার সাথে একটি ভাল সমাধান রয়েছে 301;)


121
2018-06-23 17:19



চমৎকার আপনি এটি উদ্ধৃত করার চেষ্টা করুন, কিন্তু 301 HTTPS কাজ করে না। - Case
কি কাজ করে না? এনক্রিপ্ট সার্ভারে স্থায়ীভাবে পুনঃনির্দেশিত হওয়ার জন্য এনক্রিপ্ট করা http (কোনটি ছাড়া) ট্র্যাফিকের জন্য নির্ধারিত সার্ভার বিভাগটি (443 (https) তে শোনাচ্ছে এমন বিভাগ তালিকাভুক্ত নয়) - kmindi
আমি এইচটিপিএল এবং সবকিছু দিয়ে দুর্দান্ত কাজ করেছিলাম - @ কেমিন্ডি আমি আপনার উত্তরটি রেফারেন্স দিয়ে আপডেট করেছি - যেমনটা আমি মনে করি এটি সঠিক উপায় এবং এটি পপিং আপ রাখে! চমৎকার কাজ. - Michael Neale
একটি ডোমেন (নন-আইপি) অনুরোধ ব্যবহার করার সময়, আমি '[::]: 80' থেকে '80' পরিবর্তন না করা পর্যন্ত কাজ করে না। - Joseph Lust
যে প্রত্যাশিত আচরণ হতে পারে: trac.nginx.org/nginx/ticket/345। আমি শো বিকল্প বর্ণনা উত্তর আপডেট। - kmindi


উপরোক্ত নতুন সাবডোমেনগুলি সর্বদা তৈরি হওয়ার সাথে সাথে কাজ করে না। উদাহরণস্বরূপ প্রায় 30 টি সাবডোমেনের জন্য AAA.example.com BBB.example.com।

অবশেষে নিম্নলিখিত সঙ্গে কাজ একটি কনফিগার পেয়েছিলাম:

server {
  listen 80;
  server_name _;
  rewrite ^ https://$host$request_uri? permanent;
}
server {
  listen  443;
  server_name example.com;
  ssl on;
  ssl_certificate /etc/ssl/certs/myssl.crt;
  ssl_certificate_key /etc/ssl/private/myssl.key;
  ssl_prefer_server_ciphers       on;
# ...
# rest of config here
# ...
}

17
2018-06-25 04:29



ধন্যবাদ! nginx হয় ফিরে আসবে 301 https://*/ অথবা এখানে অন্যান্য উত্তরগুলিতে অকালিকালীন অনুরোধটি বাতিল করুন। server_name _; সঙ্গে $host উত্তর ছিল যে কৌশল ছিল। +1 টি - zamnuts
এই এক সর্বোত্তম! তবে, আমি কিছু প্রতিস্থাপন করার জন্য সুপারিশ _ প্রকৃত ডোমেইন দিয়ে, যেমন .domain.com আমার দুটি সার্ভার ছিল, এবং nginx ঘটনাক্রমে আমার সার্ভারগুলির একটি ডিফল্ট সার্ভারে নির্দেশ করে। - zzz
এই একমাত্র উত্তর যে আমার জন্য কাজ, ধন্যবাদ! - Snowman
ধন্যবাদ অনেক বন্ধু .. আমি অনেক সমাধান চেষ্টা করেছি কিন্তু কাজ করে নি। এই সমাধান সন্ত্রস্ত এবং এটি আমার জন্য কাজ করে। সার্ভার নাম _; এই জন্য বোঝানো হয় .. আমি বুঝতে পারিনি। আমাকে এই ব্যাখ্যা করুন। - Pavan Kumar


সার্ভার ব্লকের মধ্যে আপনি নিম্নলিখিতগুলিও করতে পারেন:

# Force HTTPS connection. This rules is domain agnostic
if ($scheme != "https") {
    rewrite ^ https://$host$uri permanent;
}

16
2017-07-31 19:50



এই কনফিগারেশন আমার সার্ভার একটি পুনঃনির্দেশ লুপ উত্পাদন করতে - Corkscreewe
হয়তো জায়গাটিতে আরেকটি পুনঃনির্দেশ আছে বা আপনার সাইট / অ্যাপ্লিকেশানে https সক্ষম করা নেই - Oriol
অন্য কেউ এই ছাড়া কাজ করলো। Nginx সংস্করণ ব্যবহার করে: nginx / 1.10.0 (উবুন্টু) - ThatGuy343
https: // $ host $ uri এর জন্য আপভোট - AMB
আপনি যদি লোডালান্সারের পেছনের পেছনের দিকে যেতে চান! - Antwan


আমি অনেক আগে একটি সঠিক সংশোধন সহ অনেক আগে সঠিক উত্তরটির উপর একটি মন্তব্য পোস্ট করেছি, তবে আমি মনে করি এই সংশোধনটি নিজের উত্তরটিতে হাইলাইট করা দরকার। পূর্বের কোনও উত্তর ব্যবহার করা নিরাপদ নয় যদি কোনও সময়ে আপনি অসুরক্ষিত HTTP সেট আপ করেন এবং ব্যবহারকারীর সামগ্রী আশা করেন, ফর্মগুলি, একটি API হোস্ট করেন, বা আপনার সাইটের সাথে কথা বলতে কোনও ওয়েবসাইট, সরঞ্জাম, অ্যাপ্লিকেশন বা ইউটিলিটি কনফিগার করেছেন।

সমস্যা যখন একটি ঘটে POST অনুরোধ আপনার সার্ভারে করা হয়। একটি প্লেইন সঙ্গে সার্ভার প্রতিক্রিয়া 30x পুনর্নির্দেশ পোস্ট কন্টেন্ট হারিয়ে যাবে। কি ঘটেছে যে ব্রাউজার / ক্লায়েন্ট এসএসএল অনুরোধ আপগ্রেড করবে কিন্তু ডাউনগ্রেড দ্য POST একটি GET অনুরোধ। দ্য POST পরামিতি হারিয়ে যাবে এবং ভুল অনুরোধ আপনার সার্ভারে করা হবে।

সমাধান সহজ। আপনি একটি ব্যবহার করতে হবে HTTP 1.1 307 পুনর্নির্দেশ। এটি RFC 7231 S6.4.7 এ বিস্তারিত জানানো হয়েছে:

  Note: This status code is similar to 302 (Found), except that it
  does not allow changing the request method from POST to GET.  This
  specification defines no equivalent counterpart for 301 (Moved
  Permanently) ([RFC7238], however, defines the status code 308
  (Permanent Redirect) for this purpose).

সমাধান, গৃহীত সমাধান থেকে অভিযোজিত, ব্যবহার করা হয় 307 আপনার পুনঃনির্দেশ কোডে:

server {
       listen         80;
       server_name    my.domain.com;
       return         307 https://$server_name$request_uri;
}

server {
       listen         443 ssl;
       server_name    my.domain.com;
       # add Strict-Transport-Security to prevent man in the middle attacks
       add_header Strict-Transport-Security "max-age=31536000"; 

       [....]
}

6
2018-03-19 20:24



খুব, খুব handfull কমান্ড। ধন্যবাদ! - Denis Matafonov


আমি এটা ভালো করতে পেরেছি:

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

https://stackoverflow.com/a/36777526/6076984


4
2018-04-21 18:27



আপডেট করা সংস্করণ, w / o IF: paste.debian.net/plain/899679 - stamster


আমি একটি AWS ELB পিছনে ngnix চলমান করছি। ই এলবি http এর উপর ngnix কথা বলা হয়। যেহেতু ELB ক্লায়েন্টদের পুনঃনির্দেশগুলি পাঠানোর কোন উপায় নেই, তাই আমি এক্স-ফরোয়ার্ড-প্রটো শিরোনামটি পরীক্ষা করে দেখি এবং পুনঃনির্দেশিত করি:

if ($http_x_forwarded_proto != 'https') {
    return 301 "https://www.exampl.com";
}

3
2018-01-04 17:09





আপনি যদি return 301 https://$host$request_uri; পোর্ট 80 এর ডিফল্ট প্রতিক্রিয়া হিসাবে, তখন আপনার সার্ভার শীঘ্রই ও পরে খোলা প্রক্সিগুলির একটি তালিকা পেতে পারে [1] এবং ইন্টারনেটে অন্যত্র ট্র্যাফিক পাঠাতে অপব্যবহার শুরু করে। যদি আপনার লগগুলি এইরকম বার্তাগুলির সাথে পূরণ হয় তবে আপনি জানেন যে এটি আপনার সাথে ঘটেছে:

42.232.104.114 - - [25/Mar/2018:04:50:49 +0000] "GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1" 301 185 "http://www.ioffer.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Hotbar 4.1.8.0; RogueCleaner; Alexa Toolbar)"

সমস্যা হল যে $host ব্রাউজার যাই হোক না কেন পাঠাতে ইকো করবে Host শিরোনাম বা এমনকি HTTP এর খোলার লাইন থেকে হোস্টনাম, এটির মতো:

GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1

যে সমস্যার কারণে, এখানে অন্য কিছু উত্তর ব্যবহার করার সুপারিশ $server_name পরিবর্তে $host$server_name সবসময় কি মূল্যায়ন আপনি মধ্যে রাখা server_name ঘোষণা। কিন্তু যদি আপনার কাছে একাধিক সাবডোমেন থাকে বা একটি ওয়াইল্ডকার্ড ব্যবহার করে তবে এটি কাজ করবে না $server_name শুধুমাত্র ব্যবহার করে প্রথম এন্ট্রি পরে server_name ঘোষণা, এবং আরো গুরুত্বপূর্ণভাবে শুধুমাত্র একটি ওয়াইল্ডকার্ড (এটি প্রসারিত না) প্রতিধ্বনি।

সুতরাং নিরাপত্তা বজায় রাখার ক্ষেত্রে একাধিক ডোমেন সমর্থন কিভাবে? আমার নিজের সিস্টেমে আমি এই দ্বন্দ্ব মোকাবেলা করেছি প্রথম একটি তালিকা default_server ব্যবহার করে না যে ব্লক $host, এবং তারপরে একটি ওয়াইল্ডকার্ড ব্লক তালিকাভুক্ত করে:

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

(আপনি দ্বিতীয় ব্লকের একাধিক ডোমেনও তালিকাভুক্ত করতে পারেন।)

যে সংমিশ্রণ সঙ্গে, মিলিত ডোমেইন কোথাও hardcoded পুনঃনির্দেশিত করা হবে (সবসময় example.com), এবং আপনার নিজের সাথে মেলে এমন ডোমেনগুলি সঠিক স্থানে যাবে। আপনার সার্ভার একটি উন্মুক্ত প্রক্সি হিসাবে দরকারী হবে না, তাই আপনি কষ্ট আকৃষ্ট করা হবে না।

আপনি অলঙ্কার অনুভব করছি, আমি মনে করি আপনি করতে পারে default_server ব্লক ম্যাচ না আপনার বৈধ ডোমেইন এবং আপত্তিকর কিছু পরিবেশন করা। । । ।

[1] টেকনিক্যালি "প্রক্সি" ভুল শব্দ, কারণ আপনার সার্ভার ক্লায়েন্টদের জন্য অনুরোধগুলি পূরণ করছে এবং অনুরোধগুলি পূরণ করছে, কেবল একটি পুনঃনির্দেশ পাঠানো হচ্ছে, কিন্তু আমি নিশ্চিত নই যে সঠিক শব্দটি কী হবে। আমি নিশ্চিত নই যে গোলটি কী, তবে এটি আপনার লোগোকে গোলমাল দিয়ে ভরাট করে এবং আপনার CPU এবং ব্যান্ডউইথ ব্যবহার করে, তাই আপনি এটির জন্য একটি স্টপও রাখতে পারেন।


0
2018-03-25 05:58