Làm cách nào để nginx chuyển hướng từ www sang tên miền không www?


9

Giả sử tôi muốn chuyển hướng từ www.example.com sang example.com và tôi muốn làm điều này bằng nginx. Tôi nhìn xung quanh và không thấy bất kỳ tài liệu tốt về điều này vì vậy tôi đoán rằng tôi sẽ hỏi và trả lời câu hỏi của riêng tôi.

Câu trả lời:


7

Tôi cũng đã xem xét điều này trên wiki Nginx và các blog khác và cách tốt nhất để thực hiện một cách khôn ngoan là làm như sau:

Để chuyển hướng từ www.example.com đến example.com bằng nginx (phiên bản 1.0.12 tại thời điểm viết).

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
}

Khi các yêu cầu đến example.com, không có câu lệnh nào được sử dụng để thực hiện. Và nó sử dụng $ request_uri thay vì phải tạo một trận đấu $ 1 đánh thuế việc viết lại (xem trang Cạm bẫy chung của Nginx).

Nguồn:


Trong thử nghiệm của tôi, các chỉ thị phải được đảo ngược, tức là. người viết lại phải đến sau server {}khối cấu hình chính .
karmi

4

Sau khi đào một số xung quanh và một số sai lầm, đây là giải pháp. Gotcha tôi gặp phải là để đảm bảo sử dụng " http://example.com $ uri". Chèn a / trước $ uri dẫn đến chuyển hướng đến 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

Vui lòng truy cập câu hỏi này trong SO: https://stackoverflow.com/a/11733363/846634

Từ câu trả lời tốt hơn:

Trên thực tế, bạn thậm chí không cần viết lại.

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

Như câu trả lời của tôi đang ngày càng nhận được nhiều phiếu hơn nhưng cũng như trên. Bạn không bao giờ nên sử dụng một rewritetrong bối cảnh này. Tại sao? Bởi vì nginx phải xử lý và bắt đầu tìm kiếm. Nếu bạn sử dụng return(cần có trong bất kỳ phiên bản nginx nào), nó sẽ trực tiếp dừng thực thi. Điều này được ưa thích trong bất kỳ bối cảnh.


1

Để chuyển hướng đến không www, sửa đổi tệp vhost:

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

'Vĩnh viễn' biến chuyển hướng thành chuyển hướng 301. Sau khối mã này, bạn có thể định cấu hình tên miền mà không cần www.

Để chuyển hướng không www sang www:

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

Thassit.

BTW, để thiết lập VPS đầy đủ bằng Nginx, hãy xem Kinh thánh VPS trên trang web của tôi, guvnr.com và tôi hy vọng điều đó có ích!


0

Đây là những gì tôi sử dụng:

# ---------------------------------------
# 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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.