Giới Thiệu Apache Mod_Rewrite. Cách Thiết Lập Rule Rewrite Cơ Bản

Bài viết này sẽ Giới Thiệu Apache Mod_Rewrite Và Cách Thiết Lập Rule Rewrite Cơ Bản. Nếu bạn cần hỗ trợ, xin vui lòng liên hệ VinaHost qua Hotline 1900 6046 ext.3, email về support@vinahost.vn hoặc chat với VinaHost qua livechat https://livechat.vinahost.vn/chat.php.

Giới thiệu apache mod_rewrite

Mod_rewrite module hỗ trợ rewrite các request URLs trên website theo nguyên tắc cú pháp regular-expression. Module này cũng có thể dùng cho trường hợp redirect URL hay gọi các site proxy nội bộ trên hệ thống.

Mod_rewrite là một module rewrite mạnh mẽ, sử dụng nhiều phương thức để tạo rule redirect. Không giới hạn số lượng điều kiện rewrite và có thể sử dụng server variables, environment variables, HTTP header hay mốc thời gian để thực hiện redirect.

Mod_rewrite hoạt động trên toàn bộ đường dẫn URL bao gồm các data được nhập trên URL. Các rewrite rule có thể được định nghĩa trong các file httpd.conf trên hệ thống, file .htaccess trên source. Các rewrite rule có thể dẫn đến truy vấn theo chuỗi, khởi chạy chương trình nội bộ, gửi request ra bên ngoài hệ thống, hoặc gọi các proxy nội bộ.

Các chỉ thị mod_rewrite

Chỉ thị Description
RewriteEngine Bật, tắt Rewrite, Rewrite mặc định không hoạt động cho tất cả thư mục, ở thư mục nào cần kích hoạt thì ta có thể bật bằng việc định nghĩa RewriteEngine như sau:
RewriteEngine on
RewriteBase Thiết lập URL cơ sở cho thư mục
RewriteBase URL-path
RewriteOptions Thiết lập một số options đặc biệt trên từng thư mục.
Những option phổ biến:
+ inherit: áp dụng cấu hình từ thư mục cha
+ AllowAnyRUI: Cho phép thay đổi toàn bộ URI thay vì chỉ URL
+ MergeBase: Áp dụng RewriteBase cho các thư mục con chưa được định nghĩa RewriteBase.
RewriteMap Định danh tập tin với chức năng mapping để chèn và thay đổi đường dẫn URL.
RewriteMap examplemap txt:/path/to/file/map.txt
Từ rewritemap trên có thể truy vấn từ rewriterule tương ứng:
RewriteRule ^/ex/(.*) ${examplemap:$1}
Các tập tin mapping được định nghĩa với format như:
${ MapName : LookupKey }
${ MapName : LookupKey | DefaultValue }
RewriteRule
RewriteEngine Pattern Substitution [flags]
Chỉ thị này thay thế URL theo cú pháp ở trên, các chuỗi URL gửi đến mà phù hợp với mẫu Pattern (mẫu là biểu thức chính quy) thì được thể URL gửi đến thành URL mới là Substitution, phía sau cú pháp có thể có một số loại cờ thiết lập
Ví dụ: khi URL gửi đến là /welcome.html thì Apache sẽ truy cập /html/index.html trên bộ source
RewriteRule ^welcome\.html$ /html/index.html [L]
Trong đó:
 + ^welcome\.html$ là mẫu kiểm tra URL, việc định nghĩa các ký tự đặc biệt như ^,\,$,… tuân theo các quy luật regex trên hệ thống unix/linux

 + /html/index.html chuỗi thay thế (Substitution) nếu URL gửi đến phù hợp với mẫu. Trường hợp Substitution bằng – có nghĩa là URL sẽ không bị biến đổi (thường dùng truy cập các thư mục file).
 + [L] là cờ thiết lập cho biết kếu luật này thi hành thì không thi hành các luật ở RewriteRule viết sau nó nữa. Ngoài ra có các cờ thiết lập khác cho thêm vào [], nhiều cờ thì cách nhau qua dấu , như:
    [QSA] Viết thêm query string định nghĩa vào sau đoạn URI được request.
    [F] trả về mã 403 cấm truy cập
    [G] trả về mã 410 file bị xóa
    [N] Rule lặp đị lặp lại cho đến khi kết quả URL không còn bị thay thế. Có thể chỉ ra số lần lặp [N=100]
    [R=code] chuyển hướng URL với mã code chỉ ra (ví dụ [R=301])
RewriteCond
RewriteCond TestString CondPattern [flags]
Điều kiện để RewriteRule phía dưới nó được áp dụng. Đầu tiên URI kiểm tra bởi RewriteCond (có thể kiểm tra URL, Method, biến môi trường …), điều kiện đúng RewriteRule gần nhất sau RewriteCond sẽ được dùng để Rewrite. RewriteCond có kiểm tra điều kiện rất đa dạng, thông tin tham khảo:
[flags] cờ thiết lập, ví dụ [OR] toán tử hoặc kết hợp hai RewriteCond (mặc định là toán từ và. [NC] phân biệt chữ hoa, thường
CondPattern mẫu – biểu thức chính quy để kiểm tra sự phụ hợp của TestString, hoặc một số giá trị đặc biệt như:
    -s kiểm tra TestString là file trên đĩa (có filesize, name)
    -l kiểm tra là symbolic link
    -d kiểm tra là thư mục trên đĩa
TestString chuỗi chứa tham số kiểm tra:
    Chứa biến toàn cục bằng cú pháp %{NAME_OF_VARIABLE}, các biến gửi đến như đã biết trong PHP như: QUERY_STRING, REMOTE_ADDR (IP), REMOTE_HOST, REQUEST_METHOD, SCRIPT_FILENAME, REQUEST_SCHEME, HTTP_USER_AGENT, HTTP_HOST. Tương tự biến môi trường đưa vào bằng %{ENV:variable}, các Header HTTP đưa vào bằng %{HTTP:header}
    Ví dụ: Rewrite khi trình iPhone hoặc Android truy cập (kiểm tra USER_AGENT)
    RewriteCond  "%{HTTP_USER_AGENT}"  "(iPhone|Android)"
    RewriteRule  ... (viết rule)

Thiết lập một số rule rewrite cơ bản

Chuyển hướng từ non www website sang www website

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • Giải nghĩa:

VD: đường link được request là example.com/product.php?index=7

%{HTTP_HOST}      TestString - hostname được request, example.com
!^www\.            CondPattern – URI request không bắt đầu với www
[NC]               flags – nocase, không phân biệt viết hoa, viết thường
(.*)               Pattern – match toàn bộ URI request
%{REQUEST URI}     Toàn bộ URI request, product.php?index=7

[L,R=301]          flags – L(Last) chỉ áp dụng rewriterule hiện tại và bỏ qua các rule còn lại, R(Redirect) trả về response status code 301

Rewrite rule chặn hotlinking

Image hotlinking là tình trạng các website khác sử dụng URL hình ảnh website chúng ta để load trên website họ, gây tải không mong muốn trên website. Nếu sử dụng apache làm webserver, ta có thể hạn chế hotlinking bằng việc điều chỉnh file htaccess với rule như sau:

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC]
RewriteRule \.(gif|png|jpeg|jpg|svg)$ - [F]
  • Giải nghĩa:
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC]

Điều kiện: Giá trị request HTTP_REFERER không khớp với domain example.com

RewriteRule \.(gif|png|jpeg|jpg|svg)$ - [F]

RewriteRule: các file có phần mở rộng là hình ảnh được trả về mã 403 Forbiden Denied (flag [F]-Forbiden).

Chúc quý khách thực hiện thành công!

THAM KHẢO CÁC DỊCH VỤ TẠI VINAHOST

>> SERVER – COLOCATION – CDN

>> CLOUD – VPS

>> HOSTING

>> EMAIL

>> WEBSITE

>> TÊN MIỀN

>> SSL – LICENSE

Was this article helpful?