Bagaimana cara mendapatkan nginx untuk mengalihkan dari www ke domain non-www?

9

Katakanlah saya ingin mengalihkan dari www.example.com ke example.com dan saya ingin melakukan ini menggunakan nginx. Saya melihat sekeliling dan tidak melihat dokumentasi yang baik tentang ini jadi saya pikir saya akan bertanya dan menjawab pertanyaan saya sendiri.

Jauder Ho
sumber

Jawaban:

7

Saya juga melihat ini di wiki Nginx dan blog lain dan cara terbaik untuk kinerja bijaksana adalah dengan melakukan hal berikut:

Untuk mengalihkan dari www.example.com ke example.com menggunakan nginx (versi 1.0.12 pada saat penulisan).

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
}

Ketika permintaan datang ke example.com, tidak ada jika pernyataan digunakan untuk kinerja. Dan ia menggunakan $ request_uri daripada harus membuat kecocokan $ 1 yang mengenakan pajak penulisan ulang (lihat halaman Nginx Common Pitfalls).

Sumber:

Daemon
sumber
Dalam pengujian saya, arahan harus dibalik, yaitu. yang menulis ulang harus datang setelah server {}blok konfigurasi utama .
karmi
4

Setelah beberapa penggalian sekitar dan beberapa langkah salah, inilah solusinya. Gotcha yang saya temui adalah memastikan untuk menggunakan " http://example.com $ uri". Memasukkan a / di depan $ uri menghasilkan pengalihan ke 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;
      }
    }
  }
Jauder Ho
sumber
4

Silakan kunjungi pertanyaan ini di SO: https://stackoverflow.com/a/11733363/846634

Dari jawaban yang lebih baik:

Sebenarnya Anda bahkan tidak perlu menulis ulang.

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

Karena jawaban saya mendapatkan semakin banyak suara tetapi di atas juga. Anda tidak boleh menggunakan a rewritedalam konteks ini. Mengapa? Karena nginx harus memproses dan memulai pencarian. Jika Anda menggunakan return(yang seharusnya tersedia dalam versi nginx) langsung menghentikan eksekusi. Ini lebih disukai dalam konteks apa pun.

Ali
sumber
1

Untuk mengalihkan ke non-www, ubah file vhost:

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

'Permanen' mengubah pengalihan menjadi pengalihan 301. Setelah blok kode ini, Anda dapat mengkonfigurasi domain tanpa www.

Untuk mengarahkan non-www ke www:

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

Thassit.

BTW, untuk pengaturan VPS lengkap menggunakan Nginx, lihat VPS Bible di situs saya, guvnr.com, dan saya harap itu berguna!

Joel Coel
sumber
0

Inilah yang saya gunakan:

# ---------------------------------------
# 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
}
Neel
sumber