Cấu hình Rewrite và Location trong Nginx

Cơ sở về biểu thức chính quy (Regular Expression) trong Nginx

Để cấu hình Nginx hiệu quả, việc nắm vững các ký tự điều hướng trong biểu thức chính quy là rất quan trọng:

  • ^: Khớp tại vị trí bắt đầu của chuỗi.
  • $: Khớp tại vị trí kết thúc của chuỗi.
  • *: Khớp với ký tự đứng trước từ 0 lần trở lên.
  • +: Khớp với ký tự đứng trước ít nhất 1 lần.
  • ?: Khớp với ký tự đứng trước 0 hoặc 1 lần.
  • .: Khớp với bất kỳ ký tự đơn nào (ngoại trừ ký tự xuống dòng \n).
  • \d: Khớp với các chữ số từ 0-9.
  • \w: Khớp với ký tự chữ, số và dấu gạch dưới [A-Za-z0-9_].
  • \s: Khớp với các khoảng trắng.
  • {n}: Lặp lại chính xác n lần.
  • [abc]: Khớp với bất kỳ ký tự nào nằm trong ngoặc vuông.
  • ( ): Gom nhóm các phần tử để xử lý hoặc trích xuất biến.
  • |: Phép toán logic HOẶC (OR).

So sánh giữa Rewrite và Location

Dù cả hai đều xử lý các yêu cầu URL, mục đích sử dụng của chúng có sự khác biệt rõ rệt:

  • Rewrite: Tập trung vào việc thay đổi cấu trúc URL. Nó sửa đổi đường dẫn yêu cầu của người dùng để ánh xạ tới một tài nguyên khác hoặc chuyển hướng trình duyệt sang địa chỉ mới.
  • Location: Tập trung vào việc phân loại và xử lý yêu cầu. Nó xác định cách Nginx phản hồi dựa trên URL, ví dụ như cấu hình Proxy Pass, giới hạn truy cập hoặc chỉ định thư mục gốc (root).
Đặc tính Rewrite Location
Chức năng chính Ghi đè URL hoặc chuyển hướng (301/302). Điều hướng luồng xử lý, Proxy, kiểm soát truy cập.
Thay đổi trên trình duyệt Có thể thay đổi URL hiển thị (nếu dùng redirect/permanent). Thường không đổi URL trừ khi dùng proxy_pass tường minh.
Phạm vi áp dụng Trong block server, location hoặc if. Trong block server hoặc lồng trong location khác.

Quy tắc khớp lệnh Location

Nginx sử dụng các ký tự sửa đổi (modifiers) để xác định độ ưu tiên khi khớp URL:

  1. =: Khớp chính xác hoàn toàn (Ưu tiên cao nhất).
  2. ^~: Khớp tiền tố (prefix), nếu khớp sẽ dừng tìm kiếm các biểu thức chính quy khác.
  3. ~: Khớp theo biểu thức chính quy (có phân biệt chữ hoa/thường).
  4. ~*: Khớp theo biểu thức chính quy (không phân biệt chữ hoa/thường).
  5. /: Khớp tiền tố mặc định (Ưu tiên thấp nhất).

Thứ tự ưu tiên rút gọn: = > ^~ > ~ / ~* > Khớp tiền tố dài nhất > /

Chi tiết về tính năng Rewrite

Rewrite sử dụng module ngx_http_rewrite_module để thay đổi URL dựa trên các biến hệ thống.

Cú pháp

rewrite <regex> <replacement> [flag];

Các loại Flag phổ biến

  • last: Sau khi khớp, Nginx sẽ dừng xử lý rewrite hiện tại và bắt đầu một chu trình tìm kiếm location mới với URL đã thay đổi.
  • break: Dừng xử lý tất cả các chỉ thị rewrite tiếp theo trong block hiện tại, không bắt đầu chu trình tìm kiếm mới.
  • redirect: Trả về mã lỗi 302 (Chuyển hướng tạm thời), trình duyệt sẽ hiển thị URL mới.
  • permanent: Trả về mã lỗi 301 (Chuyển hướng vĩnh viễn).

Các ví dụ cấu hình thực tế

1. Chuyển hướng toàn bộ tên miền

Kịch bản: Chuyển toàn bộ lưu lượng từ tên miền cũ old-tech.vn sang new-portal.vn mà vẫn giữ nguyên các tham số đường dẫn.

server {
    listen 80;
    server_name old-tech.vn;
    
    if ($host = 'old-tech.vn') {
        rewrite ^/(.*)$ https://new-portal.vn/$1 permanent;
    }
    
    root html;
}

2. Chuyển hướng dựa trên địa chỉ IP (Chế độ bảo trì)

Kịch bản: Chỉ cho phép IP quản trị truy cập bình thường, các IP khác sẽ bị chuyển hướng sang trang thông báo bảo trì.

server {
    listen 80;
    server_name tech-vibe.vn;
    
    set $maintenance true;
    if ($remote_addr = "10.0.0.50") {
        set $maintenance false;
    }
    
    if ($maintenance = true) {
        rewrite ^(.+)$ /maintenance.html last;
    }
    
    location = /maintenance.html {
        root /data/www/errors;
    }
}

3. Thay đổi cấu trúc thư mục URL

Kịch bản: Chuyển các yêu cầu từ subdomain cũ sang một thư mục trên tên miền chính.

server {
    listen 80;
    server_name blog.tech-vibe.vn;
    
    location /articles {
        rewrite ^/articles/(.*)$ http://www.tech-vibe.vn/blog/$1 permanent;
    }
}

4. Chuyển hướng các file script nhạy cảm

Kịch bản: Ngăn chặn truy cập trực tiếp vào các file .php trong thư mục upload bằng cách chuyển hướng về trang chủ.

server {
    listen 80;
    server_name tech-vibe.vn;
    
    location ~* /media/.*\.php$ {
        rewrite (.+) http://www.tech-vibe.vn/ permanent;
    }
    
    location / {
        root /var/www/html;
        index index.html;
    }
}

5. Xử lý tệp tin tĩnh và động

Tối ưu hóa hiệu năng bằng cách tách biệt xử lý tệp tĩnh và chuyển tiếp các yêu cầu động cho ứng dụng phía sau.

# Khớp tiền tố cho tệp tĩnh, không xét regex sau đó
location ^~ /assets/ {
    root /data/app/static;
}

# Khớp tệp ảnh với regex không phân biệt chữ hoa thường
location ~* \.(png|jpg|webp|css|js)$ {
    root /data/app/resources;
    expires 30d;
}

# Chuyển tiếp yêu cầu PHP
location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

Thẻ: nginx rewrite-rules server-configuration regular-expressions web-server

Đăng vào ngày 8 tháng 11 lúc 06:42