วิธีการรับ nginx เพื่อเปลี่ยนเส้นทางจาก www ไปยังโดเมนที่ไม่ใช่ www


9

สมมติว่าฉันต้องการเปลี่ยนเส้นทางจาก www.example.com เป็น example.com และฉันต้องการใช้ nginx ฉันมองไปรอบ ๆ และไม่เห็นเอกสารที่ดีเกี่ยวกับเรื่องนี้ดังนั้นฉันจึงคิดว่าฉันจะถามและตอบคำถามของฉันเอง

คำตอบ:


7

ฉันยังดูสิ่งนี้ในวิกิ Nginx และบล็อกอื่น ๆ และวิธีที่ดีที่สุดที่ชาญฉลาดคือการทำสิ่งต่อไปนี้:

หากต้องการเปลี่ยนเส้นทางจาก www.example.com ไปที่ example.com โดยใช้ nginx (เวอร์ชัน 1.0.12 ขณะเขียน)

server {
  server_name www.example.com;
  rewrite ^ $scheme://example.com$request_uri permanent; 
  # permanent sends a 301 redirect whereas redirect sends a 302 temporary redirect
  # $scheme uses http or https accordingly
}

server {
  server_name example.com;
  # the rest of your config goes here
}

เมื่อมีคำขอมาที่ example.com จะไม่มีการใช้คำสั่งเพื่อประสิทธิภาพ และใช้ $ request_uri แทนที่จะต้องสร้างการแข่งขัน $ 1 ซึ่งจะเก็บภาษีการเขียนใหม่ (ดูหน้า Nginx Pitfalls สามัญ)

แหล่งที่มา:


ในการทดสอบของฉันคำสั่งจะต้องกลับรายการคือ การเขียนใหม่จะต้องมาหลังจากserver {}บล็อกการกำหนดค่าหลัก
karmi

4

หลังจากขุดไปเรื่อย ๆ และนับครั้งไม่ถ้วนนี่คือคำตอบ gotcha ที่ฉันพบคือต้องใช้ " http://example.com $ uri" การแทรก / ด้านหน้าของ $ uri ส่งผลให้เปลี่ยนเส้นทางไปที่http://example.com //

  server {
    listen 80;
    server_name www.example.com;
    rewrite ^ http://example.com$uri permanent;
  }

  # the server directive is nginx's virtual host directive.
  server {
    # port to listen on. Can also be set to an IP:PORT
    listen 80;

    # Set the charset
    charset utf-8;

    # Set the max size for file uploads to 10Mb
    client_max_body_size 10M;

    # sets the domain[s] that this vhost server requests for
    server_name example.com;

    # doc root
    root /var/www/example.com;

    # vhost specific access log
    access_log  /var/log/nginx_access.log  main;


    # set vary to off to avoid duplicate headers
    gzip off;
    gzip_vary off;


    # Set image format types to expire in a very long time
    location ~* ^.+\.(jpg|jpeg|gif|png|ico)$ {
        access_log off;
        expires max;
    }

    # Set css and js to expire in a very long time
    location ~* ^.+\.(css|js)$ {
        access_log off;
        expires max;
    }

    # Catchall for everything else
    location / {
      root /var/www/example.com;
      access_log off;

      index index.html;
      expires 1d;

      if (-f $request_filename) {
        break;
      }
    }
  }

4

กรุณาเยี่ยมชมคำถามนี้ใน SO: https://stackoverflow.com/a/11733363/846634

จากคำตอบที่ดีกว่า:

จริงๆแล้วคุณไม่จำเป็นต้องมีการเขียนซ้ำ

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

ตามคำตอบของฉันคือการได้รับคะแนนโหวตมากขึ้นเรื่อย ๆ คุณไม่ควรใช้ a rewriteในบริบทนี้ ทำไม? เพราะ nginx ต้องดำเนินการและเริ่มการค้นหา หากคุณใช้return(ซึ่งควรมีในเวอร์ชัน nginx) จะหยุดการทำงานโดยตรง สิ่งนี้เป็นที่ต้องการในทุกบริบท


1

หากต้องการเปลี่ยนเส้นทางไปที่ไม่ใช่ www ให้แก้ไขไฟล์ vhost:

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

'ถาวร' เปลี่ยนการเปลี่ยนเส้นทางเป็นการเปลี่ยนเส้นทาง 301 หลังจากบล็อกรหัสนี้คุณสามารถกำหนดค่าโดเมนโดยไม่มี www

สำหรับการเปลี่ยนเส้นทางที่ไม่ใช่ www ไปยัง www:

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

Thassit

BTW สำหรับการตั้งค่า VPS เต็มรูปแบบโดยใช้ Nginx ลองดู VPS Bible บนเว็บไซต์ของฉัน guvnr.com และฉันหวังว่ามันจะเป็นประโยชน์!


0

นี่คือสิ่งที่ฉันใช้:

# ---------------------------------------
# vHost www.example.com
# ---------------------------------------

server {

##
# Redirect www.domain.tld
##

    server_name  www.example.com;
    rewrite ^(.*) http://example.com$1 permanent;

}

# ---------------------------------------
# vHost example.com
# ---------------------------------------

server {

   # Something Something
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.