CHIA SẺ:

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 giới hạn IP truy cập, hãy sử dụng rule bên dưới:

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

    # block anyone in 127.0.1.1/24
    allow   127.0.1.1/24;
    
    # 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;
}

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 .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 .domain.com;
     if ($invalid_referer) {
        rewrite (.*)\.(jpg|jpeg|png|gif)$ http://www.domain.com/images/warning.jpg;
    }
}

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

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

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

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

location / {
    autoindex on;
}

hoặc tắt đi

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

63 Comments

  1. Thành 2

    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

        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

            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?

  2. Phan Phieu 7

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

  3. Phan Phiêu 7

    Ừ 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!

  4. dũng 75

    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.

  5. Thực 6

    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

    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

  6. Haphuyet 4

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

Comment của bạn

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