يقوم Nginx بإعادة كتابة النطاق غير البادئ بـ www إلى النطاق البادئ بـ www

StackOverflow https://stackoverflow.com/questions/1629231

  •  06-07-2019
  •  | 
  •  

سؤال

أرى Nginx وثائق HttpRewriteModule يحتوي على مثال لإعادة كتابة مجال يبدأ بـ www إلى مجال لا يبدأ بـ www:

if ($host ~* www\.(.*)) {
  set $host_without_www $1;
  rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1 contains '/foo', not 'www.mydomain.com/foo'
}

كيف يمكنني القيام بالعكس - إعادة كتابة مجال غير مسبوق بـ www إلى مجال يبدأ بـ www؟اعتقدت أنه ربما يمكنني فعل شيء مثل ما يلي، لكن Nginx لا يحب عبارة if المتداخلة.

if ($host !~* ^www\.) {                       # check if host doesn't start with www.
    if ($host ~* ([a-z0-9]+\.[a-z0-9]+)) {    # check host is of the form xxx.xxx (i.e. no subdomain)
        set $host_with_www www.$1;
        rewrite ^(.*)$ http://$host_with_www$1 permanent;
    }
}

وأردت أيضًا أن يعمل هذا مع أي اسم نطاق دون إخبار Nginx صراحةً بإعادة كتابة domain1.com -> www.domain1.com، وdomain2.com -> www.domain2.com، وما إلى ذلك.لأن لدي عدد كبير من المجالات لإعادة كتابتها.

هل كانت مفيدة؟

المحلول 3

وحسنا اعتقد انني لست بحاجة حقا الخارجي "لو" البيان منذ أنا فحص فقط للنطاقات من النموذج xxx.xxx على أي حال. الأعمال التالية بالنسبة لي، على الرغم من انها ليست قوية. اسمحوا لي أن أعرف إذا كان هناك حل أفضل.

    if ($host ~* ^([a-z0-9\-]+\.(com|net|org))$) {
        set $host_with_www www.$1;
        rewrite ^(.*)$ http://$host_with_www$1 permanent;
    }

وتحرير: أضيفت الواصلة إلى التعبير العادي لأنه هو حرف صالح في اسم المضيف

نصائح أخرى

كما هو مذكور في وثائق Nginx، يجب عليك تجنب استخدام if التوجيه في Nginx حيثما أمكن ذلك, ، لأنه بمجرد أن يكون لديك if في التكوين الخاص بك، يحتاج الخادم الخاص بك إلى تقييم كل طلب على حدة ليقرر ما إذا كان سيتم مطابقته أم لا if أم لا.

الحل الأفضل هو توجيهات الخادم المتعددة.

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

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

إذا كنت تحاول خدمة موقع مزود بتقنية SSL (HTTPS)، فلديك ثلاثة خيارات مختلفة تقريبًا.

  1. قم بإعداد عناوين IP متعددة بحيث يستمع كل توجيه خادم إلى عنوان IP الخاص به (أو منافذ مختلفة إذا كان هذا خيارًا مناسبًا لك).يحتاج هذا الخيار إلى شهادات SSL لكليهما website.com و www.website.com, ، فإما أن يكون لديك شهادة Wild Card، أو شهادة UNI (مجالات متعددة) أو مجرد شهادتين مختلفتين.
  2. قم بإعادة الكتابة في التطبيق.
  3. استخدم اللعين if التوجيه.

هناك أيضًا خيار لاستخدام SNI، لكنني لست متأكدًا من أن هذا مدعوم بالكامل حتى الآن.

if ($host !~* ^www\.) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
}
if ($host ~* ^[^.]+\.[^.]+$) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
}

ومن الممكن فقط للحصول على أسماء مضيفين صالحة لأن الطلب سيجعل أبدا على الخادم الخاص بك على خلاف ذلك، لذلك ليس هناك حاجة لبناء منطق التحقق من صحة الخاصة بك.

والوثائق إنجن إكس تحذر ضد استخدام إذا لإعادة الكتابة. يرجى الاطلاع على الرابط هنا: http://wiki.nginx.org/Pitfalls#Server_Name

وHTTP و HTTPS دون إذا كانت الظروف:

server {
    listen          80;
    listen          443;
    server_name     website.com;

    return 301 $scheme://www.website.com$request_uri;
}
server {
    listen          80;
    listen          443 default_server ssl;
    server_name     www.website.com;

    # Your config goes here #
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top