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 *

76 Comments

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

    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.

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

  3. Van 25 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.

    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;

  4. 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 !

  5. Toàn Nguyễn Hữu 16 comment

    Bạn ơi cho hỏi chút. mình đang sử dụng Hocvps, khi gõ IP thì ra nội dung website nhưng trên thanh địa chỉ vẫn là IP, khi mình thử gõ IP của hocvps.com thì tự redirect qua domain luôn, b làm cách nào vậy

  6. kaydytran 5 comment

    Luân ơi cho tớ hỏi tớ muốn chuyển từ domain này qua domain kia mà link vẫn giữ thì nhưu thế nào.
    VD: domain1.com/link1
    tớ chuyển qua domain2.com/link1
    mình phải làm sao luân.
    Cảm ơn luân

  7. Nguyễn Viết Vinh 3 comment

    Pác Luân xem giúp phần cấu hình như của e là đúng chưa với.
    server_name example.com http://www.example.com;
    return 301 $scheme://example.com$request_uri;

    E cấu hình thế này nó redirect mãi.
    Mà để như này thì web ko vào đc.
    server_name http://www.example.com;
    return 301 $scheme://example.com$request_uri;

    Sau cùng e làm với if thì chạy ok nhưng e đọc tài liệu thì nói lệnh if ko tốt
    server_name xemlienminh360.net http://www.xemlienminh360.net;
    if ($host = ‘www.example.com’) {
    rewrite ^/(.*)$ http://example.com/$1 permanent;
    }

    Pác check giúp e với. Thank

    1. Luân Trần Admin

      Post comment nên nó tự động update linh tinh rồi. Bạn liên hệ admin@hocvps nhé

  8. linh 2 comment

    mình có 1 file htaccess ở trong file uploads ntn thì cấu hình ntn vậy admin

    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ – [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /luathien/uploads/index.php [L]
    RewriteCond %{HTTP_HOST} !^localhost$ [NC]
    RewriteRule ^(.*)$ http://localhost/luathien/$1 [L,R=301]

      1. linh 2 comment

        mình có cho vào

        location /uploads/{

        }

        nhưng ko chạy dc. Bạn có thể cho mình xin email để mình gửi 3 file .htacess bạn convert giúp mình dc ko?

    1. Luân Trần Admin

      Bạn cần cấu hình đường dẫn trong table wp_options theo đúng cấu hình server nữa thì mới ko bị redirect loop nhé.

      1. Quân Vũ 2 comment

        Wow, thank you, Luân Trần.
        Mình quá tập trung vào cái vụ redirect của file cấu hình mà quên mất rule của thằng WP

  9. Le Kien 1 comment

    Chào các bác. E dùng Ubuntu giờ có hiện tượng: gõ domain.com lên trình duyệt thì sẽ tự nhảy sang http://www.domain.com khoảng nửa giây, sau đó lại về domain.com và truy cập bình thường.

    Vậy e bị lỗi gì ạ? E cảm ơn.

          1. Luân Trần Admin

            Mình thấy ok rồi đấy.
            Chỉ là vấn đề cấu hình tên miền thống nhất giữa webserver và ứng dụng thôi.

          2. Luân Trần Admin

            Lỗi kìa bạn ơi:
            Fatal error: Call to undefined method JSite::execute() in /home/teachingenglishinvietnam.com/public_html/index.php on line 40

          3. Luân Trần Admin

            Khi cài đặt VPS, bạn lưu ý chọn đúng domain đang dùng, có www hay không có www nhé.

  10. John Phạm 1 comment

    Bạn có thể sửa file nginx.conf bằng cách thêm phần
    server {
    listen 80;
    server_name example.org;
    return 301 http://www.example.org$request_uri;
    }
    Và thay đổi phần bên dưới thực hiện gọi tên miền dạng http://www.example.org về thư mục chứa file của tên miền

    server {
    listen 80;
    server_name http://www.example.org;

    }

    Bạn có thể tham khảo tại https://gist.github.com/esfand/8246661
    Mình đã thử nghiệm và thành công

  11. thao 6 comment

    đây là cấu hình ngnix.conf
    user nginx;
    worker_processes auto;
    worker_rlimit_nofile 65536;

    error_log /var/log/nginx/error.log warn;
    pid /var/run/nginx.pid;

    events {
    worker_connections 2048;
    use epoll;
    multi_accept on;
    }

    http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    include /etc/nginx/conf/ddos1.conf;
    log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
    ‘$status $body_bytes_sent “$http_referer” ‘
    ‘”$http_user_agent” “$http_x_forwarded_for”‘;

    access_log off;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    types_hash_max_size 2048;
    server_tokens off;
    server_names_hash_bucket_size 128;
    open_file_cache max=50000 inactive=30s;
    open_file_cache_valid 60s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    client_max_body_size 40m;
    client_body_buffer_size 256k;
    client_body_timeout 12;
    client_header_buffer_size 256k;
    large_client_header_buffers 4 256k;
    client_header_timeout 10;
    keepalive_timeout 22;
    keepalive_requests 200;
    keepalive_disable msie6;
    reset_timedout_connection on;
    send_timeout 30;
    gzip on;
    gzip_static on;
    gzip_disable “msie6”;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 3;
    gzip_buffers 16 8k;
    gzip_min_length 1024;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    # Cloudflare module cho nginx
    set_real_ip_from 204.93.240.0/24;
    set_real_ip_from 204.93.177.0/24;
    set_real_ip_from 199.27.128.0/21;
    set_real_ip_from 173.245.48.0/20;
    set_real_ip_from 103.21.244.0/22;
    set_real_ip_from 103.22.200.0/22;
    set_real_ip_from 103.31.4.0/22;
    set_real_ip_from 141.101.64.0/18;
    set_real_ip_from 108.162.192.0/18;
    set_real_ip_from 190.93.240.0/20;
    set_real_ip_from 188.114.96.0/20;
    set_real_ip_from 197.234.240.0/22;
    set_real_ip_from 198.41.128.0/17;
    real_ip_header CF-Connecting-IP;

    include /etc/nginx/conf.d/*.conf;
    }

    Đây là cấu hình 1 domain bình thường

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

    access_log off;
    error_log off;
    # error_log /home/domain.com/logs/error.log;
    root /home/domain.com/public_html;
    include /etc/nginx/conf/ddos2.conf;
    index index.php index.html index.htm;
    server_name domain.com;

    #///////////////////////////////////////////////////////
    #You can Only 1 rule (AAA or BBB or CCC or DDD)
    #///////////////////////////////////////////////////////
    #Run all the websites,if you use your rule, comment or delete the line below (AAA)
    #include /etc/nginx/conf/all.conf;

    #If you use your rule, comment or delete above line, and Uncoment 3 lines belows and set your rule within it.. (BBB)
    #location / {
    #Uncomment 3 lines and set your rules here!
    #}

    # Rule cho wordpress + Plugin wp super cache. (CCC)
    include /etc/nginx/conf/supercache.conf;

    # Rule cho wordpress + Plugin W3 Total Cache. (DDD)
    #include /etc/nginx/conf/w3totalcache.conf;

    #Do not delete the bottom line, if you delete google pagespeed function will not work!!
    #include /etc/nginx/ngx_pagespeed.conf;

    #security, sql injection Propeller ….(uncoment if you want to use). Because some website plugins do not run with this config, so VPSSIM to turn off default
    #include /etc/nginx/conf/block.conf;

    location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include /etc/nginx/fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 256k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    fastcgi_intercept_errors on;
    fastcgi_param SCRIPT_FILENAME /home/domain.com/public_html$fastcgi_script_name;
    }

    include /etc/nginx/conf/staticfiles.conf;
    #include /etc/nginx/conf/phpstatus.conf;
    include /etc/nginx/conf/drop.conf;
    #include /etc/nginx/conf/errorpage.conf;
    }
    Mình tìm cách chuyển từ non www sang www mà cu bi loi hoài,

  12. Nguyen Tung 43 comment

    Chào bác Luân,

    Bác cho em hỏi nhờ chút được không ạ

    Em đang có cái tên miền [abc] [xyz]
    Định cho chạy web em chính là [www] [abc] [xyz]

    Cách 1: -Vào Control domain Khai báo IP host cho [abc] [xyz] và [www] [abc] [xyz]
    -Config trong file .hatess Redirect [abc] [xyz] ==> [www] [abc] [xyz]

    Cách 2: -Trong phần quản lý tên miền em Url Redirect [abc] [xyz] ==> [www] [abc] [xyz]
    (Khi Url Redirect trong phần quản lý Domain thì Ip của [abc] [xyz] sẽ là Ip dịch vụ của domain nên sẽ khác với IP host = ip [www][abc][xyz])
    -Khai báo IP host cho [www] [abc] [xyz]

    XIn được hỏi các bác cách nào tối ưu hơn cho seo ạ
    Em đang dùng cách 1, nay muốn chuyển sang cách 2 thì có bị ảnh hưởng seo gì không ạ

  13. Trung Nam 1 comment

    Hi anh Luân,

    Em sử dụng non-www cho web của em https://domain.com/ . Em cài đặt như sau:

    1. Thêm vào file nginx.conf đoạn sau như hướng dẫn:
    server {
    server_name http://www.domain.com;
    return 301 $scheme://domain.com$request_uri;
    }

    2. Trỏ DNS Records: CNAME: http://www.domain.com sang domain.com

    Kết quả:
    Em thuy cập được domain.com và http://www.domain.com , cả 2 chuyển sang https://domain.com/ . Nhưng truy cập https://www.domain.com/, thì nó không chuyển sang https://domain.com/.
    Em dùng Rapid SSL.

    Anh xem em làm vậy đúng không mà gặp lỗi kia với ạ.

      1. Luân Trần Admin

        Domain của bạn là gì, mô tả cụ thể nhé để mình check. Thường là do cấu hình ứng dụng thôi.

        1. Trần Hữu Hào 10 comment

          Tên Miền của kenit.net

          Trước đó khi dùng hosting bên kia, thì tớ dùng http://www.kenit.net

          Nhưng sau khi chuyển qua vps thì truy cập gì nó cũng về kenit.net, ý tớ muốn ở đây là nó hiện thị nguyên http://www.kenit.net ở trên thanh địa chỉ

          Tớ đã thay link ở phần setting wordpress, nhưng nó bị chuyển hướng

          Nhờ Luân giúp đỡ

          Cảm ơn Luân

          1. Luân Trần Admin

            Do khi cài đặt bạn chọn tên miền chính không có www nên nó mới tự redirect như thế. Giờ bạn cần:
            – Thay đổi cấu hình Nginx ở folder: /etc/nginx/conf.d/kenit.net.conf
            – Thay đổi cấu hình tên miền WordPress

            Restart lại là xong.

  14. Brian 5 comment

    Mình cũng gặp trường hợp tương tự như bạn trên
    Shared hosting mình chạy domain có www
    Mình chuyển sang vps chạy script họcvps thì khi chạy www thì nó báo bị “This webpage has a redirect loop”
    MÌnh muốn website chạy www thì phải làm thế nào luân giúp với

    1. Luân Trần Admin

      Bạn lưu ý nếu add domain vào HocVPS Script mà có www thì non-www nó sẽ tự động redirect sang www. Tuy nhiên, nếu như site của bạn từ trước cấu hình sử dụng là non-www thì nó lại redirect sang www, dẫn đến vòng lặp luẩn quẩn kia.

      Site của bạn sử dụng hệ thống gì sẽ có cách xử lý tương ứng.

      1. Brian 5 comment

        Trước site của mình cấu hình là http://www.domain.com
        Khi sang vps DigitalOcrean lúc đầu mình add domain từ hocscript với domain.com
        thì khi vào bằng http://www.domain.com nó bị loop như trên.
        Mình tìm hiểu trên này thấy Redirect non-WWW sang WWW trên nginx thế là mình làm theo vẫn bị.
        Giờ mình remove domain đi và add lại với dạng http://www.domain.com từ hocscript rồi thì website đã chạy bình thường với cả 2 non www và www rồi.
        Domain mình trỏ www -> IP và @ -> IP
        Như vậy có đến 2 A record. Như vậy mình trỏ có chuẩn ko? Vì trước mình toàn trỏ mỗi @ –> IP còn www mình sử dụng CNAME.
        Thanks luân

        1. Luân Trần Admin

          Bạn trỏ 2 record như vậy cũng ok. Mà chuyển @ -> IP và www sử dụng CNAME cũng ok hết nhé.
          Vì mọi thứ hoạt động ổn rồi mà 😀

  15. huy 2 comment

    Chào anh Luân,
    Sao em cấu hình như trên dùng hovps script nhưng không chuyển từ www sang non-www dc.. mặc định site chạy non http://www... nhưng 1 số người quen www thì ko vào dc… giúp em với…Xin cảm ơn

    1. Luân Trần Admin

      Cài đặt HocVPS Script thì nó tự redirect rồi nhé, bạn không phải làm gì nữa ngoài việc trỏ record @ và www về IP của VPS.

  16. Jimmy Toan 6 comment

    Link bài viết trong website cũ của mình có dạng http://domain.com/ten-bai-viet/a-idbaiviet
    Ví dụ: bài viết 1: http://domain.com/ten-bai-viet-1/a-1
    Ví dụ: bài viết 2: http://domain.com/ten-bai-viet-2/a-2
    Giờ mình tạo website mới bằng WP, link dạng http://domain.com/ten-bai-viet/ làm sao cấu hình nginx để khi người ta truy cập vào link cũ http://domain.com/ten-bai-viet-1/a-1 thì nó tự chuyển sang link mới http://domain.com/ten-bai-viet-1
    Cám ơn Luân nhiều.

    1. Luân Trần Admin

      Yêu cầu đơn giản này bạn không nên can thiệp vào file cấu hình nginx, hãy cài đặt plugin Redirection của WordPress rồi tạo thêm rule sẽ tiện hơn.

  17. Nguyen Xuan Giang 5 comment

    Bạn ơi cho mình hỏi với. Sau khi làm thế này thì mấy trang kiểu như :
    Link PhpMyAdmin: http://domain:port/
    Xem thong tin Opcache: http://domain:port/ocp.php
    mình không truy cập được vào nữa. Có lẽ ro cái redirect này nhưng mình ko biết fix làm thế nào. Trong file domain.conf nằm trong thư mục /etc/nginx/conf.d nó có thêm 1 phần nữa là:

    server {
    listen my_port;
    access_log off;
    log_not_found off;
    error_log off;
    root /home/domain.com/public_html;
    index index.php index.html index.htm;
    server_name http://www.domain.com;

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

    location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include /etc/nginx/fastcgi_params;
    fastcgi_pass xxx.x.x.x:xxxx;
    fastcgi_index index.php;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 256k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    fastcgi_intercept_errors on;
    fastcgi_param SCRIPT_FILENAME /home/domain.com/private_html$fastcgi_script_name;
    }
    location ~* \.(bak|back|bk)$ {
    deny all;
    }
    }

    Mình biết là phải config phần này nó mới chạy được nhưng chịu ko biết phải thêm cái gì vào bạn giúp mình với. Cảm ơn bạn nhiều 😀

      1. Nguyen Xuan Giang 5 comment

        Ak đại loại là thế này nhé. Bình thường mình vẫn truy cập trang phpadmin bình thường đúng ko. Nhưng sau khi mình thực hiện chuyển từ non-www sang www và cài đặt thêm CSF Firewall thì giờ ko truy cập được vào trang đó nữa. Bạn có cách khắc phục không. Tóm tắt là thế 😀

  18. Tony 2 comment

    Cảm ơn anh đã hướng dẫn, bài này rất hay, không ít người tìm cái này mà ko thấy đâu ah. Tiện đây cho em hỏi chút. Em nghĩ nó cũng liên quan tới cái này:
    Em có cài plugin https://wordpress.org/plugins/byrev-wp-picshield-hotlink-defence/ trên VPS nhưng nó ko chạy được hết tác dụng của plugin (tóm tắt cái plugin này là nó che cái hình hiện trên GG để bắt người dùng phải vào site mình mới lấy được ảnh)
    Trước em có xài trên share host thì khi cài plugin này nó tự động chèn 1 đoạn code vào file .htaccess, nhưng sang dùng VPS thấy nó vẫn hiện code đó trên .htaccess nhưng plugin ko làm việc. Anh kiểm tra và chỉ em cách khắc phục được ko?
    Cảm ơn anh nhiều.

    1. Luân Trần Admin

      Vấn đề nó nằm ở chỗ Nghinx không sử dụng file .htaccess, bạn tìm cách chuyển mấy dòng đó sang cấu trúc của Nginx xem có chạy ko?