Khác với Apache, Nginx không sử dụng file .htaccess nên khi bạn cần rewrite url sẽ phải convert qua rule của Nginx. Trong bài viết này, mình sẽ đưa ra một số ví dụ các rule của Nginx sử dụng để rewrite url, redirect và một số cấu hình cần thiết khác.

Khi sử dụng, bạn hãy thêm vào file cấu hình conf của tên miền, với HocVPS Script thì các file cấu hình này thường nằm trong thư mục /etc/nginx/conf.d/

Canonical URLs

Đảm bảo website của bạn được search engine index một đường dẫn duy nhất.

www.mydomain.com -> mydomain.com

Redirect toàn bộ request từ www.mydomain.com sang mydomain.com, kèm theo cả đường dẫn và tham số phía sau url.

server {
      server_name www.mydomain.com;
      rewrite ^(.*) $scheme://mydomain.com$1 permanent;
}

mydomain.com -> www.mydomain.com

Redirect toàn bộ request từ mydomain.com sang www.mydomain.com, kèm theo cả đường dẫn và tham số phía sau url.

server {
      server_name mydomain.com;
      rewrite ^(.*) $scheme://www.mydomain.com$1 permanent;
}

SSL Sites

Google hiện tại đang sử dụng SSL là một yếu tố xếp hạng, nếu bạn sử dụng các site eCommerce, hãy sử dụng SSL.

Rule bên dưới sẽ redirect tất cả request sử dụng HTTPS, trường hợp này giả sử bạn sử dụng www.domain.com làm tên miền chính.

# Tells the browser to always force SSL.
if ($scheme != "https") {
    rewrite ^ https://www.mydomain.com$uri permanent;
}
if ($host != "www.mydomain.com") {
    rewrite ^ https://www.mydomain.com$uri permanent;
}

Bắt buộc sử dụng SSL

Bắt buộc phải sử dụng SSL với một đường dẫn bất kỳ:

set $redirect false; 
if ($request_uri ~ ^/manager(\/)?$ ) { 
    set $redirect true; 
} 
if ($scheme = https) { 
    set $redirect false; 
} 
if ($redirect = true) { 
    return 301 https://www.domain.com$request_uri; 
}

Tối ưu Browser Caching

Bằng việc sử dụng browser caching, website của bạn sẽ load nhanh hơn rất nhiều kể từ sau lần visit đầu tiên:

location ~* \.(?:ico|css|js|jpe?g|png|gif|svg|pdf|mov|mp4|mp3|woff)$ {
    expires 7d;
    add_header Pragma public;
    add_header Cache-Control "public";
    gzip_vary on;
}

Giới hạn IP truy cập

Trong trường hợp bạn muốn chỉ một số IP được phép truy cập, hãy sử dụng rule bên dưới:

location /manager/ {
    # allow anyone in 192.168.1.0/24
    allow   192.168.1.0/24;
    
    # allow one workstation
    allow 127.0.0.1;

    # drop rest of the world 
    deny all;
}

Block IP

Khác với trường hợp chỉ cho phép một số IP được truy cập vào, rule bên dưới sẽ block một số IP xác định trước.

location /manager/ {
    # block one workstation
    deny 192.168.1.1;

    # block anyone in 127.0.1.1/24
    deny   127.0.1.1/24;

    # allow rest of the world 
    allow all;
}

Ngăn những site khác sử dụng hình ảnh

Với đoạn code dưới, bạn sẽ hạn chế những site khác sử dụng hình ảnh trực tiếp:

location ~* \.(gif|png|jpe?g)$ {
     valid_referers none blocked ~.google. ~.bing. ~.yahoo. .domain.com *.domain.com;
     if ($invalid_referer) {
        return   403;
    }
}

Nếu bạn muốn chặn sử dụng ảnh trong 1 thư mục cụ thể:

location /wp-content/ {
     valid_referers none blocked ~.google. ~.bing. ~.yahoo. .domain.com *.domain.com;
     if ($invalid_referer) {
        return   403;
    }
}

Nếu bạn muốn thay vì báo lỗi mà hiển thị một hình ảnh khác, hãy sử dụng code bên dưới:

location ~* \.(gif|png|jpe?g)$ {
     valid_referers none blocked ~.google. ~.bing. ~.yahoo. .domain.com *.domain.com;
     if ($invalid_referer) {
        rewrite (.*)\.(jpg|jpeg|png|gif)$ http://www.domain.com/images/warning.jpg;
    }
}

Lưu ý: Nếu trong cấu hình Nginx của website đã tồn tại đoạn cấu hình riêng về file hình ảnh/video thì bạn phải gộp chung với đoạn cấu hình đó chứ không tách riêng rẽ. Ví dụ đối với HocVPS Script:

location ~* \.(3gp|gif|jpg|jpeg|png|ico|wmv|avi|asf|asx|mpg|mpeg|mp4|pls|mp3|mid|wav|swf|flv|exe|zip|tar|rar|gz|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso|eot|svg|ttf|woff)$ {
		valid_referers none blocked ~.google. ~.bing. ~.yahoo. hocvps.com *.hocvps.com;
		if ($invalid_referer) {
			return 403;
			}
		gzip_static off;
		add_header Pragma public;
		add_header Cache-Control "public, must-revalidate, proxy-revalidate";
		access_log off;
		expires 30d;
		break;
        }

Bảo vệ thư mục bằng mật khẩu

Đầu tiên, bạn cần sử dụng tool này để tạo file .htpasswd, sau đó dùng đoạn code bên dưới, giả sử mình lưu ở /root/.htpasswd

location /protectme/ {
    auth_basic "Restricted";
    auth_basic_user_file /root/.htpasswd;
}

Rewrite URL

Ví dụ bên dưới giả sử bạn muốn rewrite (không phải redirect) đường dẫn http://domain.com/listing/123 thành http://domain.com/listing.php?id=123

rewrite ^/listing/(.*)$ /listing.php?id=$1 last;

(.*) ở đây là regular expression, đại diện cho bất kỳ ký tự nào. Nếu thêm regular expression, bạn sử dụng tương ứng $2, $3

Redirect URL cũ sang URL mới

Redirect /someoldarticle.html sang /some/newarticle.html

rewrite ^/someoldarticle\.html /some/newarticle.html permanent;

Redirect domain cũ sang domain mới

Redirect http://olddomain.com và toàn bộ đường dẫn con sang domain mới http://newdomain.com

rewrite ^(.*) http://newdomain.com$1 permanent;

Redirect IP server sang domain bất kỳ

Mục đích khi truy cập vào IP server, thay vì hiển thị nội dung mặc định của Nginx, người dùng sẽ được tự động redirect đến một địa chỉ website nào đó, ví dụ domain.com.

Bạn hãy mở file cấu hình domain chính, tìm dòng nào có nội dung là listen 80 default_server; thì thay bằng listen 80; (xóa default_server). Tiếp theo, copy paste đoạn cấu hình dưới lên trên cùng file .conf, khởi động lại Nginx là xong:

server {
        listen       80  default_server;
        server_name  _;

        rewrite ^(.*) http://domain.com$1 permanent;
}

Cài WordPress trong Sub-folder

Để chạy được WordPress ở thư mục con, bạn hãy thêm đoạn code sau vào đằng trước block location / { ... }

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

Hiển thị nội dung thư mục

Nếu thư mục không có file index, khi truy cập bạn có thể gặp thông báo lỗi “403 Forbidden“, không hiển thị những file bên trong đó. Để cho phép người dùng xem được thư mục này, bạn hãy chỉnh lại autoindexon.

location / {
    autoindex on;
}

hoặc chỉnh lại là off để không hiển thị nội dung thư mục:

location / {
    autoindex off;
}

Thông thường link 404 sẽ hiển thị thông báo lỗi của Nginx hoặc trang 404 của WordPress. Nếu bạn muốn hiển thị nội dung của trang chủ, có thể thêm đoạn code sau lên trước block location / { ... }

error_page 404 /index.php;

Nội dung index.php sẽ xuất hiện, tuy nhiên header status vẫn là 404. Nếu muốn header 200 thì bạn chuyển đoạn code thành: error_page 404 =200 /index.php;

Ngoài ra có một số tool tự động convert sang rule Nginx bạn có thể tham khảo thêm như:

  1. http://www.anilcetin.com
  2. http://labs.gidix.de/nginx/
  3. https://winginx.com/en/htaccess

Comment của bạn

Lưu ý: tất cả comment đều được kiểm duyệt cẩn thận! Nếu có code bạn hãy up lên pastebin.com rồi để lại link trong comment.

168 Comments

  1. đức 31 comment

    cho e hỏi mấy cái ạ

    1) việc sử dụng nano để chỉnh file /etc/nginx/conf.d/ thì file này là file chung của toàn bộ server vps chứ ko phải file riêng của domain nào ạ?

    2) giả sử là file chung, giả sử Tối ưu Browser Caching mà e chỉ muốn tối ưu ở domain 1 mà ko muốn làm ở domain 2 thì làm thế nào?

    3) e đang chạy sub folder, như vậy là ko dùng file htacess thì e xóa đi cũng ko sao ạ?
    nhưng mà e dùng plugin wp-rocket nó yêu cầu copy 1 số code vào file này thì làm sao ạ?

    4) Chạy WordPress ở Sub-folder

    Để chạy được WordPress ở thư mục con, bạn hãy thêm đoạn code sau vào đằng trước block location / { … }
    -> ý là trong cái file /etc/nginx/conf.d/ sẽ có block location ạ? e đang dùng nano mở file đó ra thấy trắng trơn?

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

    -> Cái “demo” là thay bằng sub folder của e phải ko ạ?vậy làm sao biết đó là sub của domain nào?

    1. Việt Phương Moderator

      1. Bạn tham khảo trước các lệnh Linux cơ bản nhé. https://hocvps.com/lenh-ssh-thong-dung-nhat/ https://hocvps.com/21-cau-lenh-linux-phai-nho/
      /etc/nginx/conf.d/ là thư mục, không phải file nên khi bạn edit nó sẽ không hiện nội dung gì. Các file riêng cấu hình từng domain ở bên trong thư mục này. Ví dụ /etc/nginx/conf.d/domain1.conf/etc/nginx/conf.d/domain2.conf
      Trong trường hợp này bạn liệt kê các file trong thư mục conf.d rồi edit file cần edit
      2. Tương tự câu 1
      3. Nginx không hoạt động trên .htaccess. Bạn convert rule sang Nginx rồi áp dụng.
      4. Tương tự câu 1

  2. Ngo Quang Triu 12 comment

    Chào mấy anh cho em hỏi với ạ. Em có cái htacces này em dùng web http://www.anilcetin. com/
    để đổi qua nginx

    # Do not remove this line, otherwise mod_rewrite rules will stop working

    php_value default_charset utf-8

    Options +FollowSymLinks
    Options -Indexes
    DirectoryIndex index.php

    RewriteEngine On
    RewriteBase /

    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ index.php/$1 [L,QSA]

    RewriteCond %{REQUEST_URI} ^application.*
    RewriteRule ^(.*)$ index.php/$1 [L,QSA]

    RewriteCond $1 !^(index.php|assets|css|js|scripts|icons|images|img|media|xml|user_guide|robots.txt|favicon.ico)

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule ^(.*)$ index.php/$1 [L,QSA]

    RewriteRule ^(.*)$ index.php?/$1 [L,QSA]

    order allow,deny
    allow from all

    Đã đổi

    if ($uri ~ “^system.*”){
    set $rule_0 1$rule_0;
    }
    if ($rule_0 = “1”){
    rewrite ^/(.*)$ /index.php/$1 last;
    }
    if ($uri ~ “^application.*”){
    set $rule_1 1$rule_1;
    }
    if ($rule_1 = “1”){
    rewrite ^/(.*)$ /index.php/$1 last;
    }
    if ($1 !~ “^(index.php|assets|css|js|scripts|icons|images|img|media|xml|user_guide|robots.txt|favicon.ico)”){
    set $rule_2 1$rule_2;
    }
    if (!-f $request_filename){
    set $rule_2 2$rule_2;
    }
    if (!-d $request_filename){
    set $rule_2 3$rule_2;
    }
    if ($rule_2 = “321”){
    rewrite ^/(.*)$ /index.php/$1 last;
    }
    rewrite ^/(.*)$ /index.php?/$1 last;

    ===============================
    Nhưng em bỏ vào config của domain và xóa htaccsec thì ko thể vào được web. kiểu như server bị lỗi. mấy anh ai biết lỗi chổ nào giúp e với ạ 🙁 Em cảm ơn.

  3. Trung Hậu 3 comment

    Có vấn đề mới hix hix
    Trong Directadmin user của em được config như sau
    /usr/local/directadmin/data/users/xxxuser/nginx.conf
    server
    {
    listen 45.63.1.xxx:80;
    server_name xxxuser.net http://www.xxxuser.net ;
    access_log /var/log/nginx/domains/xxxuser.net.log;
    access_log /var/log/nginx/domains/xxxuser.net.bytes bytes;
    error_log /var/log/nginx/domains/xxxuser.net.error.log;
    root /home/xxxuser/domains/xxxuser.net/public_html;
    index index.php index.html index.htm;
    include /usr/local/directadmin/data/users/xxxuser/nginx_php.conf;
    include /etc/nginx/webapps.conf;
    include /home/xxxuser/xxxuser.conf;
    return 301 https://$host$request_uri;
    }

    /usr/local/directadmin/data/users/xxxuser/nginx_php.conf
    # use fastcgi for all php files
    location ~ \.php$
    {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include /etc/nginx/fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include /etc/nginx/nginx_limits.conf;
    if (-f $request_filename)
    {
    fastcgi_pass unix:/usr/local/php56/sockets/xxxuser.sock;
    }
    }

    /home/xxxuser/xxxuser.conf;
    error_page 500 /error_page/50x.php;
    error_page 404 /error_page/40x.php;
    location / {
    rewrite ^/([a-zA-Z_-]+)-([a-zA-Z_-]+).ken$ /?act=$1&type=$2;
    }
    location /block.ken {
    rewrite ^(.*)$ /error_page/block.php;
    }
    location /logout.ken {
    rewrite ^(.*)$ /logout.php;
    }
    location /index.html {
    rewrite ^(.*)$ /index.php;
    }

    Khi chạy url /post-one.ken trang chạy bình thường.
    Khi chạy file block.ken thì trang trắng (block.php là một file rỗng)
    Khi chạy file logout.ken thì nó tự tải file đó về luôn (logout.php chứa code php)
    Khi chạy file index.html thì nó hiện ra trang chủ và không tải về như logout.ken

    Vậy là e cấu hình bị lỗi ạ? Giúp e với ạ. E mới chuyển qua Nginx dùng ạ.

  4. TongHoa 1 comment

    Rewrite subdomain wordpress trên Nginx như thế nào vậy ban? Hướng dẫn mình với.

    1. Việt Phương Moderator

      Bạn tạo subdomain bằng WordPress Multisite à? Bạn dùng chức năng ParkDomain để add subdomain vào cùng với domain chính
      Khi đó bạn có file Nginx Conf của riêng subdomain (trong /etc/nginx/conf.d)
      Có file cấu hình Nginx của subdomain thì bạn rewrite như bình thường. Coi nó như 1 site độc lập có cấu hình riêng

  5. Pham Minh Quang 5 comment

    Dear Luân!!

    Mình đang gặp phải 1 số khó khăn ở Nginx, mong Luân giúp mình với.

    Tình hình là website mình như sau:

    nhachop.com/shop/san-pham-1

    giờ mình muốn chuyển sang nhachop.com/san-pham-1

    mình dùng plugin để loại bỏ chử shop thì khi thêm sản phẩm vào và view sản phẩm thì báo lỗi

    OOPS! THAT PAGE CAN’T BE FOUND.

    Inline image 1

    sau đó mình có biên dịch htaccess ra như sau:

    # nginx configuration
    location /shop {
    rewrite ^/shop/(.+)$ /$1 redirect;
    }
    location / {
    rewrite ^(.+)$ /$1 redirect;
    rewrite ^(.+)$ /$1 redirect;
    rewrite ^(.+)$ /$1 redirect;
    rewrite ^(.+)$ /$1 redirect;
    rewrite ^(.+)$ /$1 redirect;
    rewrite ^(.+)$ /$1 redirect;
    rewrite ^(.+)$ /$1 redirect;
    rewrite ^(.+)$ /$1 redirect;
    }
    location /vc_grid_item {
    rewrite ^/vc_grid_item/(.+)$ /$1 redirect;
    }
    location /service {
    rewrite ^/service/(.+)$ /$1 redirect;
    }
    location /look-books {
    rewrite ^/look-books/(.+)$ /$1 redirect;
    }
    location /colection {
    rewrite ^/colection/(.+)$ /$1 redirect;
    }

    Nhưng khi chèn vô /etc/nginx/conf.d/domain… reset lại Nginx thì nó báo lỗi duplicate và ko cho reset.

    Vậy làm sao để mình có thể bỏ chử shop mà web vẫn hoạt động bình thường được bạn.

    Mong bạn giúp mình với, mình xin chân thành cảm ơn

    1. Việt Phương Moderator

      Ví dụ, rule nó không kết thúc với redirect đâu bạn rewrite ^/shop/(.+)$ /$1 redirect; và Nginx reload nó sẽ báo luôn cho bạn biết rule sai dòng nào để bạn bik cần vào sửa.
      ví dụ là rewrite ^/shop/(.*)$ /$1 last;
      Chèn rewrite url vào Nginx Conf của domain, phần block server có thư mục root của web.

  6. Tin 1 comment

    Giúp mình với..
    Đây là file htaccess:
    —————————

    RewriteEngine on
    RewriteRule ^country-study-([0-9]+).html$ country_study.php?id=$1
    RewriteRule ^country-study-d-([0-9]+).html$ country_study_d.php?id=$1
    RewriteRule ^country-study-detail-([0-9]+).html$ country_study_detail.php?id=$1
    RewriteRule ^visa-detail-([0-9]+).html$ visa-detail.php?id=$1
    RewriteRule ^register-events-([0-9]+).html$ register-events.php?id=$1
    RewriteRule ^latest-news-detail-([0-9]+).html$ latest_news_detail.php?id=$1
    RewriteRule ^(.*).html$ $1.php

    —————————————–

    Còn dưới đây là rule config trên Nginx. Mình không hiểu sao khi bấm Read More (href tới latest-news-detail-2.html) nó hiện 404 Nginx not found.
    **********
    # nginx configuration
    location /country {
    rewrite ^/country-study-([0-9]+).html$ /country_study.php?id=$1;
    rewrite ^/country-study-d-([0-9]+).html$ /country_study_d.php?id=$1;
    rewrite ^/country-study-detail-([0-9]+).html$ /country_study_detail.php?id=$1;
    }
    location /visa {
    rewrite ^/visa-detail-([0-9]+).html$ /visa-detail.php?id=$1;
    }
    location /register {
    rewrite ^/register-events-([0-9]+).html$ /register-events.php?id=$1;
    }
    location /latest {
    rewrite ^/latest-news-detail-([0-9]+).html$ /latest_news_detail.php?id=$1;
    }
    location ~ ^/ {
    rewrite ^/(.*).html$ /$1.php;
    }
    ****
    Mình cảm ơn

    1. Việt Phương Moderator

      Bạn để trong thư mục demo đúng không? Phần bạn thêm vào, bạn thử location /demo/ {xem?

      1. Quoc 5 comment

        đã fixx dc rồi, bỏ ngoài thư mục gốc mới dc, bỏ trong thu mục con thì bị lỗi, thanks mod nhé

    2. Quoc 5 comment

      mình cũng đang bị trường hợp này. Giống y chang. Bạn fix dc thì chỉ mình với nha, chứ cả tuần rùi vẫn chưa ra cách.

  7. Van Nguyen 29 comment

    Vậy bây giờ mình có cần sao lưu toàn bộ dữ liệu của web để cài lại vps mới rồi up lại không bạn? Nếu cứ để nguyên như hiện nay thì nó có làm sao ko, mình vẫn thấy web đang chạy bình thường.

    Theo như bạn hướng dẫn là mình vào file nginx rồi tạo cái acb.com.conf thay cho hocvps.com.conf phải không. Bên trong file abc.com.conf mình đặt code như thế nào trong cổng 80 nhỉ?

    1. Việt Phương Moderator

      Bạn thêm website bằng HocVPS menu sẽ tự tạo đầy đủ cả thư mục web và Nginx conf cho bạn nhé. Khi đó bạn chỉ cần up source code vào thư mục web với chỉnh sửa Nginx conf (nếu cần) thôi

      1. Vannguyen 29 comment

        Cảm ơn bạn hồi âm. Web mình cài bằng hocvps của bạn mà, nhưng mình quên gõ domain để mặc định, giờ mình để nguyên như vậy chỉ sửa conf thôi được chứ. Mình chưa học cách sao lưu code và data từ nginx nên ngại up ra up vào. Nếu sửa file conf thì sửa ở cổng 80 thôi hả bạn

        1. Việt Phương Moderator

          Nếu thế bạn không cần sửa gì cả. Bạn chạy Hocvps menu để thêm website là domain của bạn thôi. Domain hocvps để nguyên đó chỉ để Quản lý HocVPs Script

  8. vannguyen 29 comment

    Bạn ơi, khi mình vào etc/nginx/conf.d thì có 1 cái file là hocvps.com.conf (liệu mình có cài nhầm gì không nhỉ, nó là domain của hocvps chứ không phải là domain của mình). Tiếp tục dùng Notepad truy cập vào file đó thì ra danh sách code thì thấy có 2 cổng, một cổng 80 và một cổng của mình tạo (abc). Vậy đoạn code dưới đây chèn vào cổng nào?

    location ~* \.(?:ico|css|js|jpe?g|png|gif|svg|pdf|mov|mp4|mp3|woff)$ {
    expires 7d;
    add_header Pragma public;
    add_header Cache-Control “public”;
    gzip_vary on;
    }

    Hiện nay, web mình đã có trang 404 của wp tạo nhưng trong WMT vẫn báo lỗi 404. Mình muốn đặt lệnh redirect 301 toàn bộ các link 404 về trang chủ hoặc 1 trang nào đó, bạn cho xin đoạn code, mình xem trên các web khác viết ông chẳng bà chuộc không ra sao cả

    Trong file hocvps.com.conf của mình toàn code của hocvps.com như thế này có đúng không bạn

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

    server {
    listen 80;

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

    # 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 hocvps.com;

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

    1. Việt Phương Moderator

      _File hocvps.com.conf là file cấu hình Nginx mặc định khi lúc cài HocVPS bạn không nhập tên miền cụ thể.
      Cấu hình phần này không có tác dụng gì với domain của bạn. Bạn sửa file Nginx conf tương ứng với domain của bạn nhé
      _Bạn sửa phần port 80 quy định root và server_name của site nhé. Trong cấu hình Nginx của HocVPS mặc định cũng có cấu hình phần location cho các file .js, mp3,… Bạn đọc sẽ thấy, gần cuối

  9. Le Vu 11 comment

    A luân cho em hỏi là khi redirect domain cũ sang domain mới mà em có cài ssl cho domain cũ rồi thì chèn đoạn code kia vào trong file .conf như thế nào ạ?

    1. Việt Phương Moderator

      Bạn chèn rewrite ^(.*) http://newdomain.com$1 permanent; vào các block 80 và 443.
      Bình thường, chỉ cấu hình SSL thì bạn sẽ redirect http:// http://www về HTTPS. https://www. sẽ về HTTPS. Cuối cùng chỉ tồn tại duy nhất HTTPS
      Giờ thì bạn set toàn bộ các block đều redirect về domain mới

          1. Việt Phương Moderator

            Bỏ http đi. Nginx Conf thường có 3 block chứ nhỉ, gồm 2 block 443 và 1 block 80. Làm như bên dưới

            server {
            listen 443 ssl http2;
            server_name domaincu.com;
            rewrite ^(.*) https://domainmoi.com$1 permanent;
            }
            server {
            listen 80;
            server_name domaincu.com www.domaincu.com;
            rewrite ^(.*) https://domainmoi.com$1 permanent;
            }
            server {
            listen 443 ssl http2;
            server_name www.domaincu.com;
            rewrite ^(.*) https://domainmoi.com$1 permanent;
            }

            Nếu chỉ có 2 block thì làm như dưới

            server {
            listen 443 ssl http2;
            server_name domaincu.com www.domaincu.com;
            rewrite ^(.*) https://domainmoi.com$1 permanent;
            }

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

          2. vu 11 comment

            Quên mất: domain cũ có cần thêm https k ad nhỉ? Vì domain cũ e cũng cài ssl

          3. Việt Phương Moderator

            Không cần, listen 443 đã tương đương https rồi. Như khi em không gõ gì là port 80 HTTP

  10. Haphuyet 6 comment

    File default.conf cua em

    server {

    error_page 404 = /index.php;
    error_page 403 = /index.php;
    error_page 500 = /index.php;
    error_page 502 = /index.php;
    error_page 503 = /index.php;
    error_page 504 = /index.php;

    listen 80 default_server;

    access_log off;
    error_log off;

    root /home;
    index index.php index.html index.htm;

    location / {
    rewrite ^/(.*).html$ /$1.php;
    }

    location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
    }

    server {

    error_page 404 = /404.php;
    error_page 403 = /403.php;

    listen 80;

    access_log off;
    error_log off;

    root /var/www/html;
    index index.php index.html index.htm;
    server_name *.com *.net *.org *.biz *.info *.us *.asia *.name *.in *.me *.tv *.mobi *.club *.co *.cc *.cz *.ch *.nl *.pl *.mx *.uk *.pro *.vip *.tk *.ga *.cf *.ml *.gq *.xyz *.top *.bid *.pw *.win *.online *.site *.tech *.trade *.space *.press *.science *.webcam *.accountant *.loan *.racing *.faith *.party *.cricket *.website *.review *.vn *.diet *.pics *.click *.link *.uno *.date *.download;

    location = /favicon.ico {
    log_not_found off;
    access_log off;
    }

    location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
    }

    location / {
    # This is cool because no php is touched for static content.
    # include the “?$args” part so non-default permalinks doesn’t break when using query string
    try_files $uri $uri/ /index.php?$args;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires max;
    log_not_found off;
    }

    location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
    }

    1. Việt Phương Moderator

      Kiểm tra file nginx conf của bạn đoạn nào để https sửa thành http

      1. Khải 4 comment

        Hola a!
        Cho e hỏi muốn redirect từ domain.com/cat/post.html sang domain.com/cat.post ( non .html) thì dùng lệnh nào trong nginx ạ?
        Trước e dùng link dạng .html nên giờ chuyển sang non .html, các bài chia sẻ và index trong google nó đều về 404, buồn ghê. Em dùng hocvps script ạ.

        1. Việt Phương Moderator

          Bạn cho link cụ thể đi để mình xem. cat sẽ tùy biến như thế nào hay cố định

          1. Khai 4 comment

            Trong permalink của wp là…/%category%/%postname% ạ.
            Thực ra là trước đây em có thêm đuôi /%category%/%postname%.html nên các post em chia sẻ trên mạng xh đều có đuôi .html. Giờ em dùng non-.html nên khi click các link cũ nó đều về 404.
            Em muốn hỏi cách để nginx redirect toàn bộ các link có .html về bài viết tương ứng nhưng không có .htm .
            Cảm ơn anh!

          2. Việt Phương Moderator

            Rule cụ thể theo cấu trúc link chứ không phải auto kiểu .html về non-html là được đâu bạn. Khi làm thế, các phần không phải post cũng bị đổi theo rất mệt

  11. Thực 6 comment

    Anh luân ơi giúp e chút với

    File htaccess bên host của e là thế này

    RewriteEngine on
    RewriteCond %{HTTP_HOST} !domain.com$ [NC]
    RewriteRule ^(.*)$ http://domain.com/$1 [L,R=301]
    RewriteRule ^video/([0-9]+)/(.*).html$ view.php?url=$2&id=$1
    RewriteRule ^xvideos/([0-9]+)/(.*).html$ view_xvideos.php?url=$2&id=$1
    RewriteRule ^page/([0-9]+)$ index.php?page=$1
    RewriteRule ^page/([0-9]+)/$ index.php?page=$1
    RewriteRule ^tag/([a-zA-Z0-9_-]+).html$ search.php?q=$1&ok=a
    RewriteRule ^tag/([a-zA-Z0-9_-]+)/([0-9]+)$ search.php?q=$1&ok=a&page=$2
    RewriteRule ^category/([a-zA-Z0-9_-]+)$ category.php?url=$1
    RewriteRule ^category/([a-zA-Z0-9_-]+)/$ category.php?url=$1
    RewriteRule ^category/([a-zA-Z0-9_-]+)/page/([0-9]+)$ category.php?page=$2&url=$1
    RewriteRule ^category/([a-zA-Z0-9_-]+)/page/([0-9]+)/$ category.php?page=$2&url=$1
    RewriteRule ^sitemap_index.xml$ sitemap_index.php
    RewriteRule ^sitemap_index-([0-9]+).xml$ sitemap_index.php?page=$1
    RewriteRule ^sitemap.xml$ sitemap.php
    RewriteRule ^sitemap-([0-9]+).xml$ sitemap.php?page=$1
    RewriteRule ^sitemaptag.xml$ sitemap-tag.php
    RewriteRule ^sitemaptag-([0-9]+).xml$ sitemap-tag.php?page=$1
    RewriteRule ^top.html$ top.php
    ErrorDocument 404 /?act=404

    E đã thử cài lại trong /etc/nginx/conf.d nhưng không được
    A giúp e fix cho với đúng cấu hình như thế này chạy được được trên nginx ko ạ.
    Cảm ơn anh

  12. dũng 119 comment

    Không được Luân ơi 🙁 ko biết sai ở chỗ nào

    # nginx configuration
    error_page 404 /404.html;
    location / {
    if ($http_host !~ “^www.domian.com$”){
    rewrite ^(.*)$ http://www.domian.com/$1 redirect;
    }
    if (!-e $request_filename){
    rewrite index.php / break;
    }
    rewrite ^/([a-zA-Z0-9-]+).rss$ /rssnoidung.php?alias=$1;
    rewrite ^/([a-zA-Z]+)-([a-zA-Z0-9-%,]+)-([0-9]+)x([0-9]+).([a-zA-Z0-9]+)$ /xuli/timthumb.php?src=hinhanh/$1/$2.$5&w=$3&h=$4;
    rewrite ^/([a-zA-Z]+)-([a-zA-Z0-9-%,]+)-w([0-9]+).([a-zA-Z0-9]+)$ /xuli/timthumb.php?src=hinhanh/$1/$2.$4&w=$3;
    rewrite ^/([a-zA-Z]+)-([a-zA-Z0-9-%,]+)-h([0-9]+).([a-zA-Z0-9]+)$ /xuli/timthumb.php?src=hinhanh/$1/$2.$4&h=$3;
    rewrite ^/([0-9]+)__([a-zA-Z0-9]+).html /index.php?mucluc=kichhoattaikhoan&user_id=$1&user_random=$2;
    rewrite ^/([a-zA-Z0-9-]+).html$ /index.php?mucluc=loaitinsanpham&alias=$1;
    rewrite ^/([a-zA-Z0-9-]+)/page([0-9]+).html$ /index.php?mucluc=loaitinsanpham&alias=$1&page=$2;
    rewrite ^/([a-zA-Z0-9-]+)$ /index.php?mucluc=gianhang&useralias=$1;
    rewrite ^/([a-zA-Z0-9-]+)/page([0-9]+)$ /index.php?mucluc=gianhang&useralias=$1&page=$2;
    rewrite ^/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)$ /index.php?mucluc=gianhang&useralias=$1&alias=$2;
    rewrite ^/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/page([0-9]+)$ /index.php?mucluc=gianhang&useralias=$1&alias=$2&page=$3;
    }
    location /404 {
    rewrite ^/404.html /404.htm break;
    }
    location /index {
    rewrite ^/index.html /index.php;
    }
    location = /admin {
    rewrite ^(.*)$ /admin/index.php;
    }
    location = /en {
    rewrite ^(.*)$ /index.php?nn=en;
    }
    location /page {
    rewrite ^/page([0-9]+).html /index.php?page=$1;
    }
    location /xulidangnhap {
    rewrite ^/xulidangnhap.html /xulidangnhap.php;
    }
    location = /sitemap.xml {
    rewrite ^(.*)$ /home/sitemap/sitemapxml.php;
    }
    location = /sitemap.html {
    rewrite ^(.*)$ /index.php?mucluc=sitemap;
    }

    1. Luân Trần Admin

      Trường hợp này bạn liên hệ mail, nói cụ thể case nhé. Mình support cho.

  13. Phan Phiêu 9 comment

    Ừ bình thường nó sinh ID như vậy thì plugin nó cứ “loading…”, không hiển thị được file pdf, html của mình. Cho nên nếu share link tới người khác mà có cả ID của plugin thì rất bất tiện, vì nó không show file pdf của mình nhúng vào bài viết.

    Mình muốn rewrite lại thì như thế nào nhỉ? Bạn chỉ dùm mình được không?

    Cám ơn bạn!

  14. Phan Phieu 9 comment

    Hi bạn Luân!

    Cho mình hỏi chút là:
    site của mình dùng plugin đọc file pdf và show lên, thì url nó tự sinh ra ID sau dấu #, kiểu như:
    domain.com/bai-viet#ID
    Nếu click vào link này thì các file pdf không show được, mà ở chế độ waiting….
    Còn nếu bỏ #ID thì load bình thường.
    Ví dụ: http://thuvienthaythonglac.net/index.php/thu-muc-tu-lieu/item/523-chuyen-nhan-qua-lieu-phap-26-10-2001#.WEAEih-g_2E

    Mình muốn bỏ cái #ID thì làm thế nào?
    Hoặc bất cứ link nào dạng domain.com/bai-viet#ID sẽ được tự động chuyển về domain.com/bai-viet thì làm sao?

    Website mình dung NGINX

    Cám ơn bạn Luân nhé!

    1. Việt Phương Moderator

      Có rule rewrite URL nhưng mình thấy vấn đề của bạn là link tích hợp ở plugin chứ không phải link bài viết ở address mà.

  15. Thành 2 comment

    server {
    listen 80 default_server;

    # access_log off;
    access_log /home/dm.vn/logs/access.log;
    # error_log off;
    error_log /home/dm.vn/logs/error.log;

    root /home/dm.vn/public_html;
    index index.php index.html index.htm;
    server_name dm.vn;

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

    location = /wp-login.php{
    allow 192.168.1.1/24;
    allow 127.0.0.1;
    deny all;
    }
    }

    File cấu hình nginx của domain em là như thế, em thêm đoạn location = /wp-login.php{
    allow IP Của EM;
    deny all;
    } vào để giới hạn ip đăng nhập mà sao ip nào vào wp-login.php cũng bị 403 hết anh?

      1. Thành 2 comment

        server {
        listen 80;

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

        # access_log off;
        access_log /home/dm.vn/logs/access.log;
        # error_log off;
        error_log /home/dm.vn/logs/error.log;

        root /home/dm.vn/public_html;
        index index.php index.html index.htm;
        server_name dm.vn;

        location = /wp-login.php {
        allow 116.102.220.67;
        deny all;
        }

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

        Vẫn không được anh, hjx.

          1. Thành 1 comment

            server {
            listen 80;

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

            # access_log off;
            access_log /home/dm.vn/logs/access.log;
            # error_log off;
            error_log /home/dm.vn/logs/error.log;

            root /home/dm.vn/public_html;
            index index.php index.html index.htm;
            server_name dm.vn;

            location /wp-login.php {
            allow 116.102.220.67;
            deny all;
            }

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

            Nếu bỏ dấu = ở location thì ip nào vào cũng được a. Hjx

          2. Luân Trần Admin

            Format đúng của nó không có dấu = mà. Bạn xem cả bài viết này có chỗ nào có dấu = không?

    1. Minhdtcc 3 comment

      Lúc trước minh dùng Apache (Vesta CP_ thì web chạy ok , khi chuyển dùng NginX (Vesta CP) thì bị lỗi 404 Page Not Found (mặc dù cấu hình CSDL ok)

      1. Luân Trần Admin

        Khi chuyển sang Nginx bạn phải cấu hình lại đường dẫn tĩnh đó, xem đoạn code file .htaccess là gì để chuyển sang tương ứng.

        1. Minhdtcc 3 comment

          Anh Luân xem giúp cấu hình file nginx.conf cho web chạy em:

          1. File .htaccess, có nội dung:

          RewriteEngine on
          # if a directory or a file exists, use it directly
          RewriteCond %{REQUEST_FILENAME} !-f
          # otherwise forward it to index.php
          RewriteRule .* index.php [L]

          # General setting to properly handle LimeSurvey paths
          # AcceptPathInfo on

          2. File nginx.conf, có nội dung:
          server {
          listen 10.176.173.8:80;
          server_name khaosat.dtcc.edu.vn http://www.khaosat.dtcc.edu.vn;
          root /home/khaosat/web/khaosat.dtcc.edu.vn/public_html;
          index index.php index.html index.htm;
          access_log /var/log/nginx/domains/khaosat.dtcc.edu.vn.log combined;
          access_log /var/log/nginx/domains/khaosat.dtcc.edu.vn.bytes bytes;
          error_log /var/log/nginx/domains/khaosat.dtcc.edu.vn.error.log error;

          location / {

          location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|css|js)$ {
          expires max;
          }

          location ~ [^/]\.php(/|$) {
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          if (!-f $document_root$fastcgi_script_name) {
          return 404;
          }

          fastcgi_pass 127.0.0.1:9009;
          fastcgi_index index.php;
          include /etc/nginx/fastcgi_params;
          }
          }

          error_page 403 /error/404.html;
          error_page 404 /error/404.html;
          error_page 500 502 503 504 /error/50x.html;

          location /error/ {
          alias /home/khaosat/web/khaosat.dtcc.edu.vn/document_errors/;
          }

          location ~* “/\.(htaccess|htpasswd)$” {
          deny all;
          return 404;
          }

          include /etc/nginx/conf.d/phpmyadmin.inc*;
          include /etc/nginx/conf.d/phppgadmin.inc*;
          include /etc/nginx/conf.d/webmail.inc*;

          include /home/khaosat/conf/web/nginx.khaosat.dtcc.edu.vn.conf*;
          }

          Anh xem giúp, cám ơn anh nhiều!

  16. Cuong Ngo 142 comment

    Luân ới!
    Sao mình viết
    rewrite ^/van-phong\.html /van-phong-cho-thue/ permanent; thì được. Còn viết
    rewrite ^/van-phong-cho-thue\.html /van-phong-cho-thue/ permanent; thì nó không chạy vậy bạn @@

  17. Huy 26 comment

    [emerg] “server” directive is not allowed here in /etc/nginx/nginx.conf:63
    Lỗi như này là sao anh Luân ơi, cái “server” nó k chịu, em chèn cái
    server {
    server_name mydomain.com;
    rewrite ^(.*) $scheme://www.mydomain.com$1 permanent;
    }

    1. Luân Trần Admin

      server { } bạn phải để trong thư mục cấu hình /etc/nginx/conf.d/ chứ không được để trong file nginx.conf nhé.

  18. Tuấn Kiệt 1 comment

    Bạn ơi cho mình hỏi! Mình viết web PHP và được người anh cho dùng ké vps làm hosting, nên giờ mình phải cài bộ nginx stack để làm localhost nên mình không biết file .conf phải đặt trong thư mục nào và cần cấu hình gì cho nó không. Bạn giúp mình với nhé

  19. Lan Ạnh 18 comment

    mình thêm vào mục /etc/nginx/conf.d/abc.xyz.conf
    server {
    ……….
    location ~ \.(jpe?g|png|gif)$ {
    valid_referers none blocked abc.xyz *.abc.xyz;
    if ($invalid_referer) {
    return 403;
    }
    }
    ====> không sử dụng được cho website XYZ thì phải ?? Hình lấy từ web xyz qua bên blogspot hoặc những web khác đều hiện bình thường hết. Không biết ad có thử qua chưa, tốn băng thông quá

  20. Minh 21 comment

    Luân giúp mình với, hic, đoạn rewrite nginx này hoạt động tốt ở domain.com (main folder), nhưng lại không hoạt động dc ở folder con : domain.com/test/

    Đã google và thử nhìu cách nhưng vẫn ko dc. Thanks

    location /test/ {
    rewrite ^/index.html$ /index.php;
    rewrite ^/browse.html$ /category.php;
    rewrite ^/browse-(.*)-videos.html$ /category.php?cat=$1;
    rewrite ^/browse-(.*)-videos-([0-9]+)-(.*).html$ /category.php?cat=$1&page=$2&sortby=$3;
    rewrite ^/videos.flv(.*)$ /videos.php$1;
    rewrite ^/videos.mp4(.*)$ /videos.php$1;
    rewrite ^/register.html$ /register.php;
    rewrite ^/contact_us.html$ /contact_us.php;
    rewrite ^/edit_profile.html$ /edit_profile.php;

    1. Luân Trần Admin

      Bạn vẫn phải quy định folder trong câu lệnh rewrite, viết lại như ví dụ này nhé:

      location /test/ {
                      rewrite ^/test/index.html$ /test/index.php;
      
  21. Phạm Tuấn 1 comment

    Muốn chỉ tên miền của mình chạy được file php còn bỏ sang tên miền khác không chạy được thì cấu hình như thế nào nhỉ?

  22. Pham Anh Tuan 6 comment

    Muốn không cho sử dụng file php ngoài tên miền của mình, dùng trên tên miền khác thì không chạy được thì cấu hình như nào bạn nhỉ???

    1. Luân Trần Admin

      Bạn có thể tạo riêng một virtual host của tên miền đó và cấu hình lại.

  23. Thiện 29 comment

    Anh Luân cho em hỏi,
    em dùng tool này để converd file .httaccess của Opencart
    thì nó ra đoạn này :
    # nginx configuration
    location ~ .*\.(ico|gif|jpg|jpeg|png|js|css) {
    }
    autoindex off;
    location / {
    if (!-e $request_filename){
    rewrite ^/(.*)\?*$ /index.php?_route_=$1 break;
    }
    if ($query_string ~ “^route=common/home$”){
    rewrite ^/index.php$ http://boomart.com.vn/? redirect;
    }
    }
    location = /sitemap.xml {
    rewrite ^(.*)$ /index.php?route=feed/google_sitemap break;
    }
    location = /googlebase.xml {
    rewrite ^(.*)$ /index.php?route=feed/google_base break;
    }
    location /system {
    rewrite ^/system/download/(.*) /index.php?route=error/not_found break;
    }
    location ~ (?i)((\.tpl|\.ini|\.log|(?<!robots)\.txt)) {
    deny all;
    }
    "
    nhưng khi em chèn vào file conf của em rồi Reboot lại host, xong thì vô nó báo là

    Không thể truy cập trang web này

    boomart.com.vn đã từ chối kết nối.
    Tìm kiếm boomart vn admin index trên Google
    ERR_CONNECTION_REFUSED

    anh có thể chỉnh lại giúp em dc ko

      1. Thiện 29 comment

        em sử dụng script Hocvps mà đâu có hình gì đâu
        chỉ dùng mặc định, rồi add cái file httaccess đã conver qua nginx vô là báo lỗi từ đầu đến cuối e đã thử xóa từng ít 1 rồi vẫn vậy
        Tại em dùng Opencart nếu không có file httaccess thì các sản phẩm không hiển thị tên riêng, mà nó ra tên mặc định không tốt cho Seo

        1. Luân Trần Admin

          Mình thấy mấy tool convert tự động toàn lỗi thôi, bạn nên tìm kiếm các cấu hình có sẵn được chia sẻ trên mạng mà dùng ấy, khả năng chạy được.

    1. Luân Trần Admin

      Bạn phải kết nối SSH hoặc sFTP để edit, ai lại truy cập thẳng thế kia.

  24. Nguyen Van Hoang 2 comment

    Anh Luân ơi, nếu em muốn cho phép truy cập file index.php còn lại cấm truy cập tất cả các file khác có đuôi .php thì viết thế nào anh? Em thử mãi mà chẳng được 🙁

      1. Nguyen Van Hoang 2 comment

        Tại để đảm bảo là lỡ có bị up shell lên server thì vẫn k dùng đc đó anh Luân. Ngoài ra còn nhiều lí do khác nữa.

      1. sinhle 71 comment

        ý mình là mình làm theo bước
        “Khi sử dụng, bạn hãy thêm vào file cấu hình conf của tên miền, với HocVPS Script thì các file cấu hình này thường nằm trong thư mục /etc/nginx/conf.d/”
        nhưng khi mình gõ dòng “/etc/nginx/conf.d/” hoặc “nano /etc/nginx/conf.d/”
        Thì nó không có gì trong file đó hết
        http://i.imgur.com/GdzYsYA.png
        Có phải mình cài lỗi không admin.
        Cảm ơn.

        1. Luân Trần Admin

          Bạn dùng sai rồi, làm gì có 2 lệnh như bạn dùng. Thử ls /etc/nginx/conf.d/ xem nó ra cái gì nhé.

  25. Lộc 3 comment

    Luân ơi, cho hỏi. Làm sao để chặn leech ảnh từ VPS dùng nginx nhỉ? Bên Apache thì mình bít rồi…

  26. Tuấn Anh 18 comment

    Em cài 1 số plugin bên WordPress, thì được yêu cầu chỉnh sửa file nginx. E dùng lệnh
    —– Nano -w /etc/nginx/nginx.conf ——-
    Sau đó thêm nội dung, save, khởi động lại đúng không anh Luân???
    P/s: nó gửi cho 1 đoạn mã khá dài, có cách nào copy paste vào file nginx không ???? (nhiều quá sợ gõ nhầm chạy không được @@)

    1. Luân Trần Admin

      Đúng rồi bạn. Ngoài ra bạn có thể login sFTP, down file đó xuống chỉnh sửa bằng Notepad rồi up đè lên lại cho dễ thao tác.

  27. Huy 4 comment

    Cho mình hỏi là mình sử dụng SSL cho website chạy trên Nginx, thì thư mục upload source của web vẫn là private_html phải không ? vì mình upload source web vô private_html thì chạy web báo not found. Cảm ơn.

    1. Luân Trần Admin

      Thư mục vẫn là public_html nhé bạn. Cái này trong file cấu hình nginx quy định.