Nginx নং-www থেকে www এবং www থেকে ন-www


497

আমি টিউটোরিয়াল অনুসরণ করে র্যাকস্পেস ক্লাউডে এনগিনেক্স ব্যবহার করছি এবং নেটটি অনুসন্ধান করেছি এবং এখনও পর্যন্ত এটি বাছাই করতে পারি না।

আমি চাই www.mysite.com এসইও এবং অন্যান্য কারণে .htaccess এ স্বাভাবিক হিসাবে mysite.com এ যান।

আমার /etc/nginx/sites-available/www.example.com.vhost কনফিগারেশন:

server {
       listen 80;
       server_name www.example.com example.com;
       root /var/www/www.example.com/web;

       if ($http_host != "www.example.com") {
                 rewrite ^ http://example.com$request_uri permanent;
       }

আমি চেষ্টাও করেছি

server {
       listen 80;
       server_name example.com;
       root /var/www/www.example.com/web;

       if ($http_host != "www.example.com") {
                 rewrite ^ http://example.com$request_uri permanent;
       }

আমিও চেষ্টা করেছি। দ্বিতীয় প্রচেষ্টা উভয়ই পুনর্নির্দেশ লুপ ত্রুটি দেয়।

if ($host = 'www.example.com' ) {
rewrite ^ http://example.com$uri permanent;
}

আমার ডিএনএস মান হিসাবে সেটআপ করা হয়েছে:

site.com 192.192.6.8 A type at 300 seconds
www.site.com 192.192.6.8 A type at 300 seconds

(উদাহরণস্বরূপ এবং ভবিষ্যতে লোকদের সহায়তা করার জন্য আইপি এবং ফোল্ডারগুলি ব্যবহৃত হয়েছে)। আমি উবুন্টু 11 ব্যবহার করি।


1
আমি মন্তব্য করতে বাধ্য হচ্ছি যে আপনি যদি ওয়ার্ডপ্রেস ওয়েবসাইটের সাথে কাজ করছেন তবে পরীক্ষা করে দেখুন Dashboard > Settings > General Settingsএবং নিশ্চিত করুন যে wwwওয়ার্ডপ্রেস ঠিকানা / সাইটের ঠিকানা URL গুলিতে কোনও নেই । আপনি নিজের এনগিনেক্স কীভাবে কনফিগার করবেন তা বিবেচনাধীন নয়, যদি এই ইউআরএলগুলিতে আপনার কাছে একটি www থাকে তবে এটি এটির সাথে www এর সাথে পুনঃনির্দেশিত হবে।
অভিনব সূদ

উত্তর:


792

HTTP সলিউশন

ডকুমেন্টেশন থেকে , "সঠিকরূপে উদাহরণ সার্ভারের জন্য একটি পৃথক সার্ভার সংজ্ঞায়িত করা":

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

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

এইচটিটিপিএস সলিউশন

যারা সহ সমাধান চান তাদের জন্য https://...

server {
        listen 80;
        server_name www.domain.com;
        # $scheme will get the http protocol
        # and 301 is best practice for tablet, phone, desktop and seo
        return 301 $scheme://domain.com$request_uri;
}

server {
        listen 80;
        server_name domain.com;
        # here goes the rest of your config file
        # example 
        location / {

            rewrite ^/cp/login?$ /cp/login.php last;
            # etc etc...

        }
}

দ্রষ্টব্য: https://যেহেতু আমরা লোডবালেন্সার ব্যবহার করি এবং আমাদের https: // সার্ভারটি একটি উচ্চ ট্র্যাফিক এসএসএল পেমেন্ট সার্ভার: আমরা https: // এবং http: // মিশ্রিত করি না তাই আমি আমার সমাধানটিতে মূলত অন্তর্ভুক্ত হইনি।


Nginx সংস্করণটি পরীক্ষা করতে, ব্যবহার করুন nginx -v

ইউআরএল থেকে এনগিনেক্স পুনর্নির্দেশের সাথে www স্ট্রিপ করুন

server {
    server_name  www.domain.com;
    rewrite ^(.*) http://domain.com$1 permanent;
}

server {
    server_name  domain.com;
    #The rest of your configuration goes here#
}

সুতরাং আপনার TWO সার্ভার কোড থাকা দরকার।

ইউএনআরএলকে এনজিনেক্স পুনর্নির্দেশের সাথে www যুক্ত করুন

আপনার যা প্রয়োজন তার বিপরীতে যদি ডোমেইন ডটকম থেকে www.domain.com এ পুনর্নির্দেশ করা যায় তবে আপনি এটি ব্যবহার করতে পারেন:

server {
    server_name  domain.com;
    rewrite ^(.*) http://www.domain.com$1 permanent;
}

server {
    server_name  www.domain.com;
    #The rest of your configuration goes here#
}

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

আরও ভাল দেখার জন্য নীচে আমার কয়েকটি কোড দেখানো হয়েছে:

server {
    server_name  www.google.com;
    rewrite ^(.*) http://google.com$1 permanent;
}
server {
       listen 80;
       server_name google.com;
       index index.php index.html;
       ####
       # now pull the site from one directory #
       root /var/www/www.google.com/web;
       # done #
       location = /favicon.ico {
                log_not_found off;
                access_log off;
       }
}

3
@ পুক এর প্রশংসা করুন এনগিনেক্স আশ্চর্যজনক, তবে ভাল ডকুমেন্টেশন যা সার্ভার সংস্করণ এবং ওএস এবং সার্ভারের হার্ডওয়্যার পরিবর্তনের সাথে আপ টু ডেট থাকে তা বেশ ক্লান্তিকর। র্যাকস্পেস ক্লাউড সংস্করণগুলিকে সমর্থন করার সাথে সাথে আমার সর্বোত্তম রিসোর্স হুটোফোর ডট কম। উপরের কয়েকটি কমান্ড পরবর্তী সংস্করণগুলিতে কাজ করবে না। তবে এই এনগিনেক্স / 0.8.54 - বিশ্বাস করুন আমাকে, সেরা এনগিনেক্স সার্ভার) আপগ্রেড বা আপডেট করার দরকার নেই। ঠিকভাবে কাজ করে. প্রতিদিন গড়ে 4200 লেনদেনের সাথে 100,000 অনন্য হিট। এনগিনেক্স র্যাপিড AP কোনও ট্র্যাফিকবিহীন সাইট ব্যবহার করার মতো।
দ্য ব্ল্যাকবেঞ্জকিড

17
আপনার পুনর্লিখনগুলি রিটার্নে পরিণত হওয়া উচিত return 301 $scheme://domain.com$request_uri;। কোনও নিদর্শন ক্যাপচার করার দরকার নেই, এনগিনেক্সের অসুবিধা দেখুন
রবার্তো

4
@ দ্য ব্ল্যাকবেঞ্জকিড দুঃখিত, আমি হয়ত কিছু মিস করেছি, তবে আপডেট হওয়া সমাধান কাজ করছে না। এটি কারণ শোনো 80 - এর সাথে আপনি বলছেন যে কেবল এইচটিটিপি এটির সাথে মিলছে। এইচটিটিপি এবং এইচটিটিপিএসের জন্য একই কনফিগারেশন ব্যবহার করা থাকলে শুনতে আরও বেশি বন্দর থাকতে হবে ... বা? তবে সুনির্দিষ্টভাবে আমাকে সহায়তা করেছে, +1। উত্তর দেওয়ার জন্য ধন্যবাদ. চিয়ার্স।
টমিস

3
@ দ্য ব্ল্যাকবেঞ্জকিড এটি কেবল নোট ছিল। আমি কাজের সমাধান খুঁজে পেয়েছি। আপনার উদাহরণে, কেবল শুনুন 443 যোগ করা উচিত এবং কাজ সম্পূর্ণ করা উচিত।
টমিস

2
উত্তর ভুল। এটি সমস্ত সাবডোমেনগুলিকে www এ পুনঃনির্দেশ করে।
r3wt

398

আসলে আপনার আবার লেখার দরকার নেই।

server {
    #listen 80 is default
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    #listen 80 is default
    server_name example.com;
    ## here goes the rest of your conf...
}

আমার উত্তরটি যত বেশি ভোট পাচ্ছে তবে উপরেরটিও। আপনার rewriteএই প্রসঙ্গে কখনও ব্যবহার করা উচিত নয় । কেন? কারণ nginx একটি প্রক্রিয়া এবং একটি অনুসন্ধান শুরু করতে হবে। আপনি যদি ব্যবহার করেন return(যা কোনও এনগিনেক্স সংস্করণে পাওয়া উচিত) এটি সরাসরি কার্যকর করা বন্ধ করে দেয়। এটি যে কোনও প্রসঙ্গে পছন্দ করা হয়।

নন-এসএসএল এবং এসএসএল উভয়কেই তাদের নন-www সহযোগে পুনঃনির্দেশ করুন:

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

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

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

    # rest goes here...
}

$schemeভেরিয়েবলটি কেবল তখনই থাকবে httpযখন আপনার সার্ভারটি কেবল পোর্ট ৮০ (ডিফল্ট) এ শুনছে এবং শ্রবণ বিকল্পটিতে sslকীওয়ার্ডটি নেই। ভেরিয়েবল ব্যবহার না করা আপনার কোনও কার্যকারিতা লাভ করবে না।

মনে রাখবেন যে আপনি যদি এইচএসটিএস ব্যবহার করেন তবে আপনাকে আরও বেশি সার্ভার ব্লক প্রয়োজন, কারণ এইচএসটিএস হেডারগুলি নন-এনক্রিপ্ট হওয়া সংযোগের মাধ্যমে প্রেরণ করা উচিত নয়। সুতরাং, আপনাকে পুনর্নির্দেশগুলি সহ এনক্রিপ্ট করা সার্ভার ব্লক এবং পুনর্নির্দেশগুলি এবং এইচএসটিএস শিরোলেখ সহ এনক্রিপ্ট করা সার্ভার ব্লকগুলি দরকার।

সমস্ত কিছু এসএসএলে পুনর্নির্দেশ করুন (ইউনিক্সের আইপিভি 4, আইপিভি 6, এসপিডিওয়াই, ... সহ ব্যক্তিগত কনফিগারেশন):

#
# Redirect all www to non-www
#
server {
    server_name          www.example.com;
    ssl_certificate      ssl/example.com/crt;
    ssl_certificate_key  ssl/example.com/key;
    listen               *:80;
    listen               *:443 ssl spdy;
    listen               [::]:80 ipv6only=on;
    listen               [::]:443 ssl spdy ipv6only=on;

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

#
# Redirect all non-encrypted to encrypted
#
server {
    server_name          example.com;
    listen               *:80;
    listen               [::]:80;

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

#
# There we go!
#
server {
    server_name          example.com;
    ssl_certificate      ssl/example.com/crt;
    ssl_certificate_key  ssl/example.com/key;
    listen               *:443 ssl spdy;
    listen               [::]:443 ssl spdy;

    # rest goes here...
}

আমার ধারণা আপনি এখন নিজেই এই প্যাটার্নটির সাথে অন্য যৌগগুলি কল্পনা করতে পারেন।

আমার কনফিগার আরও? এখানে এবং এখানে যান ।


3
আপনি যদি এইচএসটিএস ব্যবহার করেন তবে আপনার ক্রোম আপনার www ডোমেনে যেতে সক্ষম হবে না । দয়া করে যথাসম্ভব বিস্তারিত সহ একটি নতুন প্রশ্ন খুলুন এবং আমি আপনাকে সহায়তা করব (আপনি এখানে মন্তব্য হিসাবে প্রশ্নের URL টি পোস্ট করতে পারেন)।
ফ্লেশগ্রিন্ডার

1
@Fleshgrinder আমি আপনার সেটআপ বাস্তবায়ন করার চেষ্টা করছি কিন্তু নিম্নলিখিত বিষয় পেয়ে stackoverflow.com/questions/29451409/... কিভাবে এটি কাজ করা কোন ধারনা আছে?
ওয়াইপ্রেসাম্বল

4
২ য় ব্লকের "উভয়, নন-এসএসএল এবং এসএসএলকে তাদের নন-ডাব্লু কাউন্টারপার্টে পুনঃনির্দেশ করুন:", উভয় সার্ভার ব্লকেরই এসএসএল নির্দেশনা থাকা উচিত, যেমন ব্রাউজারটি উদাহরণস্বরূপ পুনঃনির্দেশ করার আগে www.example.com এর জন্য শংসাপত্রটি যাচাই করতে হবে needs .com।
জেফ সায়

1
অবশ্যই, আমি যুক্ত করেছি পাশাপাশি এইচএসটিএস সম্পর্কে একটি সংক্ষিপ্ত তথ্য।
ফ্লেশগ্রিন্ডার

1
@ ওয়াইপ্রেসাম্বল হ্যাঁ, এটি আরও দ্রুততর হয় কারণ আমরা প্রতিটি অনুরোধের সাথে নিয়মিত প্রকাশের মিল রাখছি না। আমরা কেবল তখনই পুনঃনির্দেশ করি যখন আমরা জানি যে আমাদের পুনর্নির্দেশ করতে হবে। কোনও চেক নেই, কোনও বৈধতা নেই, কিছুই নেই: কেবল পুনর্নির্দেশ করুন। =)
ফ্লেশগ্রিন্ডার

37

আপনি আরও ডোমেনের জন্য একই কনফিগারেশনটি ব্যবহার করতে চান তা খুঁজে পেতে পারেন।

নিম্নলিখিত স্নিপেট কোনও ডোমেনের আগে www কে সরিয়ে দেয়:

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

7
আমি ডেডিকেটেড সার্ভার ব্লকগুলির চেয়ে এইভাবে ভাল better পরিবর্তন httpকরার জন্য$scheme
ck_

2
আরও ভাল, বিশ্বাস করতে পারছেন না যে অনেকে এই কাজের জন্য ডোমেইনগুলিকে হার্ড-কোড করবে।
মিঃইলো

1
@ ওলি সেই লিঙ্কটি (আজকের হিসাবে) পারফরম্যান্সের কথা উল্লেখ করে না বরং বরং তারা 100% নিরাপদ নয়। এটি বলে যে "কেবলমাত্র 100% নিরাপদ জিনিস যা কোনও অবস্থানের প্রসঙ্গে থাকলে ভিতরে করা যেতে পারে: return ...এবং rewrite ... last" " পারফরম্যান্স সমস্যাগুলির জন্য কোনও আপডেট লিঙ্ক?
আদম

1
এটি আমার পক্ষে কাজ করে না। অবৈধ প্রতিক্রিয়া জানিয়ে ব্রাউজারে একটি ত্রুটি পেয়েছে।
নিকো ব্রেনার

1
দুর্ভাগ্যক্রমে, আমি "if" ছাড়া উপায় পাইনি। আমি অনেকগুলি ডোমেনের জন্য একই কনফিগারেশনটি ব্যবহার করি, ডোমেনের নামগুলি হার্ডকোডিং কোনও বিকল্প নয়। কোন পরামর্শ / মন্তব্য প্রশংসা করা হয়!
মার্টিন হগার

27

আপনার দুটি সার্ভার ব্লক দরকার।

এগুলি আপনার কনফিগারেশনের ফাইলের মধ্যে রাখুন /etc/nginx/sites-available/sitename

ধরা যাক আপনি ব্যবহার করার প্রধান ঠিকানা হিসাবে http://example.com রাখার সিদ্ধান্ত নিয়েছেন

আপনার কনফিগারেশন ফাইলটি দেখতে এমন হওয়া উচিত:

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

        # this is the main server block
        # insert ALL other config or settings in this server block
}

প্রথম সার্ভার ব্লকটি 'www' উপসর্গের সাথে কোনও অনুরোধ পুনর্নির্দেশ করার জন্য নির্দেশাবলী ধারণ করবে। এটি 'www' উপসর্গ এবং পুনঃনির্দেশগুলির সাহায্যে URL এর জন্য অনুরোধগুলি শোনায়।

এটা অন্য কিছু করে না।

দ্বিতীয় সার্ভার ব্লকটি আপনার মূল ঠিকানাটি ধারণ করবে - আপনি যে URL টি ব্যবহার করতে চান to অন্যান্য সকল সেটিংস এখানে মত যেতে root, index, location, ইত্যাদি এই অন্যান্য সেটিংস আপনি সার্ভারে ব্লক অন্তর্ভুক্ত করতে ডিফল্ট ফাইল চেক করুন।

সার্ভারের জন্য দুটি ডিএনএস এ রেকর্ড দরকার।

Name: @ IPAddress: your-ip-address (for the example.com URL)

Name: www IPAddress: your-ip-address (for the www.example.com URL)

আইপিভি 6 এর জন্য আপনার ipv6- ঠিকানা ব্যবহার করে এএএএ রেকর্ডগুলির জুড়ি তৈরি করুন।


23

একাধিক www থেকে নো-এক্স সার্ভারের নামগুলির জন্য এটি কীভাবে করবেন তা এখানে রয়েছে (আমি এটি সাবডোমেনগুলির জন্য ব্যবহার করেছি):

server {
        server_name 
             "~^www\.(sub1.example.com)$"
             "~^www\.(sub2.example.com)$"
             "~^www\.(sub3.example.com)$";
         return 301 $scheme://$1$request_uri ;
}

19
  1. সেরা অনুশীলন: পৃথক serverডাব্লু / হার্ডকোডযুক্তserver_name

এনগিনেক্সের সাথে সর্বোত্তম অনুশীলন হ'ল serverএই জাতীয় পুনর্নির্দেশের জন্য আলাদাভাবে ব্যবহার করা ( serverআপনার মূল কনফিগারেশনের সাথে ভাগ করা হয়নি), সবকিছুকে হার্ডকোড করা এবং নিয়মিত প্রকাশগুলি একেবারে ব্যবহার না করা।

আপনি এইচটিটিপিএস ব্যবহার করলে ডোমেনগুলি হার্ডকোড করাও প্রয়োজন হতে পারে কারণ আপনি কোন শংসাপত্রগুলি সরবরাহ করবেন তা আপনাকে সামনেই জানতে হবে।

server {
    server_name www.example.com;
    return  301 $scheme://example.com$request_uri;
}
server {
    server_name www.example.org;
    return  301 $scheme://example.org$request_uri;
}
server {
    server_name example.com example.org;
    # real configuration goes here
}

  1. এর মধ্যে নিয়মিত অভিব্যক্তি ব্যবহার করা server_name

আপনার যদি বেশ কয়েকটি সাইট থাকে এবং সর্বাধিক চূড়ান্ত পারফরম্যান্সের জন্য যত্ন না রাখেন তবে তাদের প্রত্যেকেরই www.উপসর্গের ক্ষেত্রে একই নীতি থাকতে চান তবে আপনি নিয়মিত ভাব প্রকাশ করতে পারেন। আলাদা ব্যবহারের সর্বোত্তম অনুশীলনটি serverএখনও দাঁড়াবে।

মনে রাখবেন যে আপনি https ব্যবহার করলে এই সমাধানটি জটিল হয়ে ওঠে, কারণ আপনার যদি এটির কাজটি করতে চান তবে আপনার সমস্ত ডোমেন নামগুলি কভার করার জন্য আপনার একক শংসাপত্র থাকতে হবে।


অ- wwwকরার wwwW / ডেডিকেটেড একক মধ্যে Regex serverসব সাইটগুলির জন্য:

server {
    server_name ~^(?!www\.)(?<domain>.+)$;
    return  301 $scheme://www.$domain$request_uri;
}

wwwসমস্ত সাইটের জন্য wwwউত্সর্গীকৃত এককগুলিতে নন- ডাব্লু / রেজেক্সকে server:

server {
    server_name ~^www\.(?<domain>.+)$;
    return  301 $scheme://$domain$request_uri;
}

wwwশুধুমাত্র কিছু সাইটের জন্য wwwউত্সর্গীকৃত নন- ডাব্লু / রেজেক্সকে server:

এটা তো ঢাকা শুধুমাত্র একটি ডোমেইন দম্পতি, তাহলে আপনি শুধুমাত্র মেলে ভালো কিছু ব্যবহার করতে পারেন Regex সীমিত করার প্রয়োজন হতে পারে www.example.org, www.example.comএবং www.subdomain.example.net:

server {
    server_name ~^www\.(?<domain>(?:example\.org|example\.com|subdomain\.example\.net))$;
    return  301 $scheme://$domain$request_uri;
}

নিয়মিত এক্সপ্রেশন ডাব্লু / এনজিনেক্স পরীক্ষা করা

আপনি পরীক্ষা করতে পারেন যে রেজেক্স pcretestআপনার সিস্টেমে প্রত্যাশার সাথে কাজ করে যা ঠিক একই pcreলাইব্রেরি যা আপনার এনগিনেক্স নিয়মিত প্রকাশের জন্য ব্যবহার করবে:

% pcretest 
PCRE version 8.35 2014-04-04

  re> #^www\.(?<domain>(?:example\.org|example\.com|subdomain\.example\.net))$#
data> test
No match
data> www.example.org
 0: www.example.org
 1: example.org
data> www.test.example.org
No match
data> www.example.com
 0: www.example.com
 1: example.com
data> www.subdomain.example.net
 0: www.subdomain.example.net
 1: subdomain.example.net
data> subdomain.example.net
No match
data> www.subdomain.example.net.
No match
data> 

নোট আপনি trailing বিন্দু বা কেস সম্পর্কে চিন্তা করতে হবে না যে, nginx ইতিমধ্যে প্রতি যেমন যত্ন নেয় হিসাবে, nginx সার্ভার নাম Regex যখন "হোস্ট" হেডারের একটি শেষে ডট হয়েছে


  1. ifবিদ্যমান server/ এইচটিটিপিএসের মধ্যে ছিটিয়ে দিন :

এই চূড়ান্ত সমাধানটি সাধারণত সেরা অনুশীলন হিসাবে বিবেচিত হয় না, তবে এটি এখনও কাজ করে এবং কাজটি করে।

প্রকৃতপক্ষে, আপনি যদি এইচটিটিপিএস ব্যবহার করে থাকেন তবে এই চূড়ান্ত সমাধানটি বজায় রাখা সহজতর হতে পারে, কারণ আপনাকে বিভিন্ন serverসংজ্ঞাগুলির মধ্যে এসএসএল নির্দেশনার পুরো গুচ্ছটি কপি-পেস্ট করতে হবে না , এবং পরিবর্তে কেবল স্নিপেটগুলিকেই এতে স্থাপন করতে পারে আপনার সাইটগুলি ডিবাগ করা এবং বজায় রাখা সহজ করে তোলে প্রয়োজনীয় সার্ভারগুলি।


অ- wwwথেকে www:

if ($host ~ ^(?!www\.)(?<domain>.+)$) {
    return  301 $scheme://www.$domain$request_uri;
}

wwwঅ- করতে www:

if ($host ~ ^www\.(?<domain>.+)$) {
    return  301 $scheme://$domain$request_uri;
}

একটি একক পছন্দসই ডোমেন হার্ডকডিং

আপনি যদি আরও কিছুটা পারফরম্যান্স চান, পাশাপাশি একক একাধিক ডোমেন serverব্যবহার করতে পারেন তবে এটি একটি স্পষ্টতই একটি পছন্দসই ডোমেনকে হার্ডকোড করা বুদ্ধিমান হতে পারে:

if ($host != "example.com") {
    return  301 $scheme://example.com$request_uri;
}

তথ্যসূত্র:


16

এই সমাধানটি আমার ব্যক্তিগত অভিজ্ঞতা থেকে আসে। আমরা বিভিন্ন আমাজন এস 3 বাকেট এবং পুনঃনির্দেশিত জন্য এক সার্ভার ব্যবহার non-wwwকরার জন্য wwwডোমেইন নাম মেলে এস 3 "হোস্ট" হেডারের নীতি

আমি nginx সার্ভারের জন্য নিম্নলিখিত কনফিগারেশনটি ব্যবহার করেছি :

server {
    listen 80;
    server_name ~^(?!www\.)(?<domain>.+)$;
    return 301 $scheme://www.$domain$request_uri;
}

এটি সার্ভারের দিকে নির্দেশিত সমস্ত ডোমেন নামগুলির সাথে মেলে যা যা শুরু করে এবং যা www.পুনঃনির্দেশ করে www.<domain>। একই পদ্ধতিতে আপনার কাছ থেকে বিপরীত পুনর্নির্দেশ করতে পারি না wwwকরার non-www


https সম্পর্কে কি? নোট: HTTPS দরকার শংসাপত্র
Toskan

এখানে HTTPS নিয়ে একেবারেই কোনও সমস্যা নেই। আপনার পরে যুক্ত listen 80করতে হবে listen 443 sslএবং তারপরে ssl_certificateএবং ssl_certificate_keyনির্দেশিকা।
ভিজিওএন

আজকাল কেউই http ব্যবহার করে না। আমি গুগলে শীর্ষস্থানীয় তালিকাভুক্ত গাইড পড়ছিলাম listen 443 ssl যা অনুপস্থিত সার্টিফিকেট সহ কেবল যুক্ত রেখার সাথে আপনার উদাহরণ দেখিয়েছিল । যে অভ্যাস কাজ করে না এবং কিছু মারাত্মক মাথা ব্যাথা ঘটাচ্ছে।
তোসকান

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

সুতরাং এই www বাদে সমস্ত সাবডোমেন ক্লোবার হবে, সঠিক?
মেটাগ্রাফার

15

আমি হার্ড-কোডেড ডোমেন ছাড়াই সমস্ত সহজ উত্তরগুলির সাথে সেরাটি একত্রিত করেছি।

301 স্থায়ী পুনঃনির্দেশ নন-www থেকে www- এ (HTTP বা HTTPS):

server {
    if ($host !~ ^www\.) {
        rewrite ^ $scheme://www.$host$request_uri permanent;
    }

    # Regular location configs...
}

আপনি যদি এইচটিটিপিএসবিহীন, এইচটিটিপিএস-তে নন-www পছন্দ করেন, www একই সময়ে পুনর্নির্দেশ করুন:

server {
    listen 80;

    if ($host !~ ^www\.) {
        rewrite ^ https://www.$host$request_uri permanent;
    }

    rewrite ^ https://$host$request_uri permanent;
}

11

অ-www কে www তে পুনঃনির্দেশ করুন

একক ডোমেনের জন্য:

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

সমস্ত ডোমেনের জন্য:

server {
        server_name "~^(?!www\.).*" ;
        return 301 $scheme://www.$host$request_uri;
}

একক ডোমেনের জন্য www-non-wwwপুনঃনির্দেশ করুন :

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

সমস্ত ডোমেনের জন্য:

server {
         server_name "~^www\.(.*)$" ;
         return 301 $scheme://$1$request_uri ;
}

আপনি 80এবং এর মধ্যে পার্থক্য প্রদান করতে পারেন 443?
হাসান বৈগ

1
এটি listenআমার জন্য কোনও নির্দেশ ছাড়াই কাজ করে বলে মনে হচ্ছে (nginx 1.4.6)।
ইব্রাহিম

11

এটা চেষ্টা কর

    if ($host !~* ^www\.){
        rewrite ^(.*)$ https://www.yoursite.com$1;
    }

অন্য উপায়: Nginx নং-www থেকে www

server {
  listen       80;
  server_name  yoursite.com;
  root /path/;
  index index.php;
  return       301 https://www.yoursite.com$request_uri;
}

এবং www থেকে ন-www

server {
  listen       80;
  server_name  www.yoursite.com;
  root /path/;
  index index.php;
  return       301 https://yoursite.com$request_uri;
}

কেন লেখকগণ এনজিএনএক্সে একটি বিবৃতি প্রদান করেছিলেন এবং লোকেরা তা এড়াতে বলেছিলেন? আমার কাছে ফ্লিপ্যান্ট লাগছে।
গ্রেগ স্মেথেলস

4
সেখানে "আইএফ যদি লোকেশন খারাপ হয়" বলে দেওয়া হয়। আপনার সার্ভার ব্লকে যদি আপনি নিরাপদে রাখতে পারেন
কুকুনিন

উপরের লিঙ্ক থেকে সরাসরি উদ্ধৃতি ... কেবলমাত্র 100% নিরাপদ জিনিস যা অবস্থানের প্রসঙ্গে থাকলে ভিতরে করা যায়: ফিরুন ...; পুনর্লিখন ... সর্বশেষ;
জাস্টিন ই

8

অনন্য বিন্যাস:

server {
  listen 80;
  server_name "~^www\.(.*)$" ;
  return 301 https://$1$request_uri ;
}

1
আপনি এইভাবে এটি লিখে জেনেরিক তৈরি করতে পারেন: server { server_name "~^www\.(.*)$" ; return 301 $scheme://$1$request_uri ; }
রামাস্ট


3

নিশ্চিত না যে কেউ 301 ফিরিয়ে দেওয়া সঠিক হতে পারে তবে ব্রাউজারগুলি এটি করতে চোক বন্ধ করে দেয়

rewrite ^(.*)$ https://yoursite.com$1; 

এর চেয়ে দ্রুত:

return 301 $scheme://yoursite.com$request_uri;


1
আমার মন্তব্য ব্রাউজারের নির্দেশিত ছিল এনজিএনএক্স দিকের দক্ষতা না রাখার জন্য! পুনর্নির্দেশের মাধ্যমে ব্রাউজার পুনর্বিবেচনাকালে 2 অনুরোধ বনাম 1 অনুরোধ করে
স্টিভেন

2

ভুত ব্লগ

return 301 $scheme://example.com$request_uri;ঘোস্টের সাথে কাজের সাথে nginx প্রস্তাবিত পদ্ধতি তৈরি করার জন্য আপনাকে আপনার প্রধান সার্ভার ব্লকে যুক্ত করতে হবে:

proxy_set_header    X-Real-IP           $remote_addr;
proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
proxy_set_header    Host                $http_host;
proxy_set_header    X-Forwarded-Proto   $scheme;
proxy_set_header    X-NginX-Proxy       true;

proxy_pass_header   X-CSRF-TOKEN;
proxy_buffering     off;
proxy_redirect      off;  

2

আপনি যদি ডোমেন নামটি হার্ডকোড করতে না চান তবে আপনি এই পুনর্নির্দেশ ব্লকটি ব্যবহার করতে পারেন। শীর্ষস্থানীয় www ছাড়া ডোমেনটি পরিবর্তনশীল হিসাবে সংরক্ষণ করা হয় $domainযা পুনর্নির্দেশ বিবৃতিতে পুনরায় ব্যবহার করা যেতে পারে।

server {
    ...
    # Redirect www to non-www
    if ( $host ~ ^www\.(?<domain>.+) ) {
       rewrite ^/(.*)$ $scheme://$domain/$1;
    }
}

REF: একটি নিয়মিত অভিব্যক্তি সহ এনজিএনএক্সে একটি সাবডোমেন পুনর্নির্দেশ



-6

এই কাজটি করতে যদি আপনার সমস্যা হয় তবে আপনার সার্ভারের আইপি ঠিকানা যুক্ত করতে হতে পারে। উদাহরণ স্বরূপ:

server {
listen XXX.XXX.XXX.XXX:80;
listen XXX.XXX.XXX.XXX:443 ssl;
ssl_certificate /var/www/example.com/web/ssl/example.com.crt;
ssl_certificate_key /var/www/example.com/web/ssl/example.com.key;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}

যেখানে XXX.XXX.XXX.XXX হল IP ঠিকানা (স্পষ্টতই)।

দ্রষ্টব্য: https অনুরোধগুলি যথাযথভাবে পুনর্নির্দেশের জন্য এসএসএল crt এবং কী অবস্থান নির্ধারণ করা উচিত

পরিবর্তনগুলি করার পরে nginx পুনরায় চালু করতে ভুলবেন না:

service nginx restart

3
/etc/init.d/nginx reloadআপনি reloadসার্ভারটিও করতে পারেন যা কোনও ডাউনটাইম সৃষ্টি করে না।
দ্য
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.