Tìm hiểu mod_rewrite trong Apache với các chỉ thị như RewriteEngine RewriteRule RewriteCond
Rewrite URL với rewrite_module
rewrite_module
là một module mở rộng của Server Apache HTTP, nếu có nạp và sử dụng module này nó cho phép bạn viết lại Url. Chức năng chính của nó là ánh xạ một địa chỉ URL đến một vị trí file cụ thể của Server, tuy nhiên bạn có thể làm nhiều hơn thế như chuyển hướng, chặn truy cập … rewrite_module
phân tích yêu cầu gửi đến bằng cách sử dụng biểu thức chính quy (Xem :
Biểu thức chính quy)
rewrite_module
mạnh và mềm dẻo, bạn có thể đưa ra số quy tắc không hạn chế để biến đổi URL, mỗi quy tắc đó cũng hoạt động dựa vào số điều kiện bạn đặt ra một cách không hạn chế.
Sử dụng mod_rewrite ở đâu ? : Nó cung cấp các chỉ thị để bạn sử dụng như RewriteBase
, RewriteCond
, RewriteRule
… để bạn viết nó trong httpd.conf
hoặc trong file .htaccess
-
Nếu chọn viết trong
.htaccess
, thì các Rewrite có hiệu lực trên thư mục đặt file đó. Khi Apache truy cập đến bất kỳ thư mục con nào thì nó cũng tìm xem trong thư mục đó có file.htaccess
không để nạp vào. Viết cách này khá linh hoạt, nhưng đôi khi làm chậm một chút, nếu có thể ở cấu hìnhVirtualHost
tắt hẳn.htaccess
bằng chỉ thịAllowOverride None
để chỉ viết trong cấu hình Apachehttpd.conf
- Các quy tắc ReWrite viết trong
httpd.conf
ở cácDirectory
củaVirtualHost
, kết quả thì cũng tương tự viết trong.htaccess
, nó nhanh hơn vì các luật ReWrite Apache không phải tìm vào nạp mỗi khi truy cập, viết xong phải khởi động lại Apache để có hiệu lực
Nhớ là để sử dụng cần đảm bảo Apache có nạp mode_rewrite
LoadModule rewrite_module modules/mod_rewrite.so
Các chỉ thị rewrite_module
Module rewrite_module cung cấp thêm cho Apache các chỉ thị để dùng gồm:
RewriteEngine
RewriteRule
RewriteCond
RewriteMap
RewriteBase
RewriteOptions
RewriteEngine
Bật, tắt Rewrite, nhớ là Rewrite mặc định không có hoạt động cho tất cả thư mục, ở thư mục nào muốn kích hoạt thì bật nên. Tóm ở mỗi thư mục bắt đầu viết các rewrite cần có dòng
RewriteEngine on
RewriteBase
RewriteBase URL-path
Thiết lập URL cơ sở cho thư mục
RewriteRule
RewriteEngine Pattern Substitution [flags]
Chỉ thị này sẽ tiến hành 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ì nó thay 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ì thực tế Apache sẽ truy cập /html/index.html
trên đĩa
RewriteRule ^welcome\.html$ /html/index.html [L]
Trong đó:
^welcome\.html$
là mẫu kiểm tra URL, các ký hiệu^
$
\.
… xem tại biểu thức chính quyTrong biểu thức
RegExp
của mẫu, các nhóm()
theo thứ tự từ trái sang phải là nhóm 1, nhóm 2 … nó có thể được gọi ra từSubstitution
hoặc từRewriteCond
. Nên rất cần hiểu về biểu thức chính quy.
Mẫu là biểu thức chính quy
^/?([a-z])/(.*)$
thì có hai nhóm, nhóm 1 là([a-z]
, nhóm 2 là(.*)
thì trongSubstitution
,RewriteCond
lấy ra chuỗi theo nhóm bằng ký hiệu$n
là$1
,$2
/html/index.html
chuỗi thay thế (Substitution
) nếu URL gửi đến phù hợp với mẫu. NếuSubstitution
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 dấu,
như:[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]
Viết điều kiện để RewriteRule
phía dưới nó được ứng dụng. Trường hợp đơn giản đầu tiên URI kiểm tra bởi RewriteCond
(có thể kiểm tra URL, Method, biến môi trường …), nếu điều kiện đúng thì RewriteRule
gần nhất sau RewriteRule
sẽ được dùng để Rewrite. RewriteCond
có kiểm tra điều kiện rất đa dạng, dưới đây là một số thứ có thể 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 đư 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)
Một số ví dụ ứng dụng mod_rewrite trong .htaccess
, httpd.conf
Truy cập đến thư mục
Bạn viết Rule đơn giản đầu tiên: Khi truy vấn URI phù hợp với đường dẫn đến file trên đĩa thì có một Rule không thay đổi URI áp dụng
RewriteEngine On RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [L] ...Các RewriteRule khác
Ví dụ trên mục đích là các truy vấn đến file cụ thể trên đĩa thì không làm gì (RewriteRule có [L], nên nếu là file thật thì quy tắc Rewrite sẽ kết thúc ở đây), nếu không phải là file thì sẽ chuyển sang các RewriteRule
Chuyển hướng URL
Chuyển hướng – Redirect rất hay áp dụng, như
- Xóa (đổi địa chỉ) một URL trên website, nhưng muốn khi người dùng truy cập vào sẽ tự chuyển sang một trang khác
- Chuyển sang một domain mới
RewriteEngine On #Chuyển hướng 1 URL cụ thể RewriteEngine on RewriteRule "^/url-cu\.html$" "url-moi.html" [R=301] #Chuyển hướng thư mục news sang domain (server mới) RewriteRule "^/docs/(.+)" "http://new.example.com/docs/$1" [R,L]
Mọi URI không có www.
(mydomain.com…) chuyển sang có www.
(www.mydomain.com…)
RewriteCond "%{HTTP_HOST}" "!^www\." [NC] RewriteCond "%{HTTP_HOST}" "!^$" RewriteRule "^/?(.*)" "http://www.%{HTTP_HOST}/$1" [L,R,NE]
Mọi URI có www sẽ chuyển sang không có www
RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC] RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L] RewriteCond %{HTTPS} on RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
Tránh mất băng thông
Giả sử trên host của bạn www.example.com
, có một hình ảnh. Nếu một trang nào đó lấy URL ảnh và hiện thị ở trang của họ thì không được phép
RewriteCond "%{HTTP_REFERER}" "!^$" RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC] RewriteRule "\.(gif|jpg|png)$" "-" [F,NC]
Mọi truy vấn khác đều chạy file index.php
Đây là cách PHP hay áp dụng nhất là trong các Framework
RewriteEngine On #Các RewriteRule khác file, directory ... RewriteRule ^.*$ index.php [NC,L]
Ví dụ trong ZendFramework
RewriteEngine On # ... RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ RewriteRule ^(.*) - [E=BASE:%1] RewriteRule ^(.*)$ %{ENV:BASE}/index.php [L]
Ngoài mod_rewrite
Apache còn có mod_alias
, cung cấp chỉ thị Redirect
, RedirectMatch
thay thế cho nhiều trường hợp của mod_rewrite
, đơn giản hơn hiệu quả hơn. Nên nếu có thể thì áp dụng module này để nâng cao hiệu suất
ĐĂNG KÝ KÊNH, XEM CÁC VIDEO TRÊN XUANTHULAB
Đăng ký nhận bài viết mới