Có rất nhiều cách để buộc Nginx sử dụng đường dẫn dạng non-www hoặc www. Mình xin giới thiệu một cách đơn giản như sau:

Redirect non-WWW sang WWW

Sửa file cấu hình của nginx (nginx.conf) hoặc nếu dùng HocVPS Script thì bạn hãy sửa file cấu hình cho từng domain trong folder /etc/nginx/conf.d/

Single domain

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

All domains

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

Từ WWW sang non-WWW

Single domain

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

All domains

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

Ngoài ra, có một số plugin WordPress có thể xử lý việc redirect này ở mức PHP-level, nhưng để có performance tốt nhất, các bạn nên để cho Nginx tự xử.

Comment của bạn

Your email address will not be published. Required fields are marked *

75 Comments

  1. Nghĩa 2 comment

    Chào Luân

    Xin phép cho mình hỏi là mình đã up code lên vps, kết nối database … rồi

    Site đã chạy ( Fontsun.com ) nhưng cứ bị lỗi ERR_INCOMPLETE_CHUNKED_ENCODING

    đây là linh ảnh báo lỗi http://www.upsieutoc.com/image/bN67G

    Bạn xem có cách nào tìm giúp mình nguyên nhân và cách khắc phục với nhé, cảm ơn cậu nhiều !

    1. Việt Phương Moderator

      Gửi mình file cấu hình Nginx của domain mình xem cho. Chủ yếu cần thêm đoạn rewrite ^(.*) https://www.domain.com$1 permanent;

  2. Van 23 comment

    Bạn Luân cho mình hỏi là việc rederect giữa www và non www có làm server nặng nhiều không vậy.

  3. sinhle 70 comment

    mình chuyển sang www thì báo lỗi 404 Not Found. Và khi truy cập link domain nó ra một đống http://1doi1.com/www.1doi1.com/www.1doi1.com/www.1doi1.com………………………………
    Nhờ ace chỉ giúp.
    cảm ơn
    Đây là file của mình sau khi thêm

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

    #other site settings go here (e.g. logs, site root)
    }
    ————— khúc dưới là code mặc định trong vps——–
    server {
    listen 80;

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

    # access_log off;
    access_log /home/1doi1.com/logs/access.log;
    # error_log off;
    error_log /home/1doi1.com/logs/error.log;

    root /home/1doi1.com/public_html;
    index index.php index.html index.htm;
    server_name 1doi1.com;

    location / {
    try_files $uri $uri/ /index.php?$args;
    }

    1. Việt Phương Moderator

      Bạn bị redirect loop do đã thiết lập redirect sai hướng (Ví dụ A sang B rồi ở đoạn khác lại B sang A). Bạn sử dụng HocVPS thì có sẵn block 80 rồi, đừng tạo ra thêm. Cụ thể 2 block server như sau, chú ý phần mình bôi đậm.

      server {
      	listen   80;
      	server_name hocvps.com;
      	rewrite ^(.*) http://www.hocvps.com$1 permanent;
          	}
      server {
      	listen   80;
          	# access_log off;
      	access_log /home/hocvps.com/logs/access.log;
          	# error_log off;
          	error_log /home/hocvps.com/logs/error.log;
      	root /home/hocvps.com/public_html;
      	index index.php index.html index.htm;
          	server_name www.hocvps.com;

      Nếu bạn dùng WP thì sửa cả siteurlhome trong MySQL database-wp-option

    1. Luân Trần Admin

      Bạn cần quy định rõ ở block server_name, cái nào non-www thì redirect sang www

      1. Luân Trần Admin

        server_name bạn không nên dùng ký tự *, mà ghi rõ là domain gì thì mới redirect được.

  4. Noi 2 comment

    Chào Luân,

    Lúc khởi tạo cài hocvps mình điền domain là: www. tenmien.com nên trong thư mục nginx/conf.d hiện có 2 file:
    – www. tenmien.com.conf
    – tenmien.com.conf

    Giờ mình muốn redirect từ non-www sang www thì sửa file nào? và sửa như thế nào? Hiện tại mình đang để code ở bên thư muc: www. tenmien.com/public_html

    PS: Mình đã thử sửa file: tenmien.com.conf theo chỉ dẫn trong bài này thì redirect được nhưng cực kỳ chậm, site phải loại tần chục s mới xong được. Không biết có phải mình upload code sai chỗ hay chỉnh sai file nginx nữa

      1. Việt Phương Moderator

        Có nhiều hơn 1 đoạn block cấu hình domain.com hay www.domain.com trong /etc/nginx/conf.d. Phần nào lặp thì bạn bỏ đi, file nào lặp thì xóa đi
        Trong Nginx Conf của HocVPS Script có ghi cụ thể cấu hình rewrite, bạn sửa cho phù hợp hệ thống và nhu cầu của mình
        server_name www.domain.com;
        rewrite ^(.*) http://domain.com$1 permanent;

        File nào quy định domain bạn cần sửa thì bạn sửa file đó. Block nào quy định cấu hình server_name bạn cần sửa thì bạn sửa block đó, cho redirect với server_name đó

        1. Việt Phương Moderator

          Như đã nói, domain.comwww.domain.com của bạn đều quy định về 1 thằng, như thế gây lặp. Bạn dùng thằng nào thì bạn xóa thằng còn lại đi, xóa bằng hocvps menu