Apache là một web server module cho phép bạn tùy chỉnh các tính năng nhanh chóng bằng cách bật và tắt các module. Từ đó giúp quản trị viên thiết lập các tính năng cho phù hợp với nhu cầu sử dụng. Trong bài viết này, bạn sẽ được hướng dẫn thiết lập mod_rewrite cho Apache trên CentOS 7 đơn giản và nhanh chóng.
Bước 1: Cài đặt Server Apache
Trước khi thực hiện bước này, bạn cần một máy chủ CentOS 7 với non-root user có đặc quyền sudo.
Bạn sẽ cài đặt Apache bằng lệnh sau:
$ sudo yum install httpd
Khi có thông báo Is this ok [yd/N]
, hãy nhập Y
và nhấn ENTER
để cho phép cài đặt.
Tiếp theo, khởi động daemon Apache, một tiến trình độc lập tạo ra một nhóm các tiến trình con hoặc thread để xử lí các yêu cầu, với tiện ích systemctl
:
$ sudo systemctl start httpd
Kiểm tra trạng thái của Apache để đảm bảo nó đã khởi động thành công:
$ sudo systemctl status httpd
Bạn sẽ nhận được output sau:
. . .
systemd[1]: Starting The Apache HTTP Server...
systemd[1]: Started The Apache HTTP Server.
Khi đã hoàn thành thiết lập và kích hoạt, bạn hãy tìm hiểu về các module của Apache.
Bước 2: Xác minh mod_rewrite
Kể từ phiên bản CentOS 7, module mod_rewrite
của Apache mặc định luôn được bật. Bạn sẽ xác minh lại xem bằng cách chạy lệnh sau:
$ httpd -M
Output nhận được như sau:
. . .
remoteip_module (shared)
reqtimeout_module (shared)
rewrite_module (shared)
setenvif_module (shared)
slotmem_plain_module (shared)
. . .
Nếu rewrite_module
không xuất hiện trong output, hãy chạy lệnh sau:
$ sudo vi /etc/httpd/conf.modules.d/00-base.conf
Khi file text được mở, hãy nhập i
để vào chế độ insert, sau đó thêm hoặc vô hiệu dòng LoadModule rewrite_module modules/mod_rewrite.so
:
#
# This file loads most of the modules included with the Apache HTTP
# Server itself.
#
. . .
LoadModule rewrite_module modules/mod_rewrite.so
. . .
Nhấn ESC
để rời khỏi mode insert, sau đó gõ :x
rồi nhấn ENTER
để lưu và thoát file.
Tiếp theo, áp dụng thay đổi cấu hình bằng cách khởi động lại Apache:
$ sudo systemctl restart httpd
Sau khi đã cài đặt Apache và kích hoạt module mod_rewrite
, bạn sẽ thực hiện cấu hình .htaccess
file.
Xem thêm: 3 bước ứng dụng Apache như Reverse Proxy bằng mod_proxy trên CentOS 7 nhanh chóng
Bước 3: Thiết lập file .htaccess
.htaccess
file cho phép xác định các directive cho Apache trên mỗi domain mà không làm thay đổi các file cấu hình máy chủ, bao gồm RewriteRule
. Trong Linux, các file có dấu chấm (.)
ở phía trước được coi là file ẩn.
Trước khi sử dụng .htaccess
file, bạn cần cập nhật cài đặt AllowOverride
để có thể overwrite (ghi đè) lên các directive của Apache:
$ sudo vi /etc/httpd/conf/httpd.conf
Xác định vị trí của phần <Directory/var/www/html>
và thay đổi directive AllowOverride
từ None
sang All
:
. . .
<Directory /var/www/html>
. . .
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride All
. . .
</Directory>
. . .
Lưu và thoát file rồi khởi động lại Apache để áp dụng thay đổi:
$ sudo systemctl restart httpd
Tiếp theo, chạy lệnh sau:
$ sudo vi /var/www/html/.htaccess
Thêm dòng sau vào đầu file để kích hoạt RewriteEngine:
RewriteEngine On
Lưu và thoát file.
Sau khi đã có một file .htaccess
giúp xác định các quy tắc để thao tác các URL khi cần, bạn hãy tìm hiểu về những cú pháp mod_rewrite
cơ bản.
Lưu ý: Để có quyền truy cập file ẩn .htaccess
cũng như thực hiện các thao tác với mod_rewrite
, bạn cần đảm bảo rằng có toàn quyền quản trị máy chủ và không bị giới hạn truy cập. Một giải pháp tốt để đảm bảo quyền truy cập và quản trị máy chủ là sử dụng VPS của Vietnix – một trong những dịch vụ VPS tốt nhất trên thị trường Việt Nam hiện nay.
Với VPS NVMe, bạn sẽ không còn phải lo lắng về việc không thể truy cập vào các tệp quan trọng hoặc không thể thực hiện các thay đổi cần thiết trên hệ thống của mình. Bên cạnh đó, VPS Vietnix còn cung cấp các tính năng sao lưu dữ liệu và hỗ trợ 24/7 để đảm bảo website của bạn luôn an toàn và vận hành ổn định. Bạn có thể lựa chọn giữa các gói VPS Giá Rẻ, VPS Phổ Thông, VPS Cao Cấp, VPS NVMe, VPS GPU sao cho phù hợp với nhu cầu sử dụng.
Liên hệ để được tư vấn chi tiết nhất.
Bước 4: Tìm hiểu cú pháp rewrite rule
Directive RewriteRule
cho phép bạn ánh xạ lại (remap) yêu cầu tới Apache dựa trên URL. Một file .htaccess
có thể chứa từ hai rewrite rule trở lên, nhưng trong thời gian chạy, Apache chỉ áp dụng các quy tắc theo thứ tự đã xác định. Rewrite rule sẽ có cấu trúc như sau:
RewriteRule Pattern Substitution [Flags]
- RewriteRule: Chỉ định directive cho
RewriteRule
. - Pattern: Sử dụng đối chiếu PCRE (Perl Compatible Regular Expression) khớp với chuỗi mong muốn.
- Substitution: Nơi gửi các yêu cầu phù hợp.
- [Flags]: Tham số tùy chọn để sửa đổi quy tắc. Để biết thêm về ý nghĩa của các flag có sẵn, hãy xem tài liệu Rewrite Flags của Apache.
Sau khi tìm hiểu về cú pháp RewriteRule
, hãy chuyển sang cú pháp RewriteCond
.
Bước 5: Tìm hiểu cú pháp rewrite cond
Directive RewriteCond
cho phép bạn thêm các điều kiện vào RewriteRule
. Một rewrite condition có cấu trúc như sau: RewriteCond TestString Condition [Flags]
- RewriteCond: Directive lệnh
RewriteCond
. - TestString: Chuỗi để kiểm tra.
- Condition: Một pattern phù hợp.
- [Flags]: Tham số tùy chọn để sửa đổi điều kiện.
Directive RewriteCond
không cho phép Apache xem xét bất kì rewrite rule nào trừ khi điều kiện cụ thể được đánh giá là đúng.
Bước 6: Thiết lập file
Bạn sẽ thiết lập rewrite rule cơ bản để cho phép người dùng truy cập trang about.html
mà không cần nhập phần mở rộng .html
vào thanh địa chỉ của trình duyệt web. Bắt đầu bằng cách tạo một file about.html
trong thư mục gốc của tài liệu:
$ sudo vi /var/www/html/about.html
Sao chép mã HTML vào file:
<!DOCTYPE html>
<html>
<head>
<title>About Us</title>
</head>
<body>
<h1>About Us</h1>
</body>
</html>
Lưu và thoát file.
Trong trình duyệt web, thực hiện truy cập địa chỉ sau:
http://server_domain_or_IP/about.html
Bạn sẽ nhận được một trang trắng với nội dung About Us. Nếu xóa .html khỏi thanh địa chỉ và tải lại trang, bạn sẽ gặp lỗi 404 Not Found. Apache chỉ có thể truy cập theo tên file đầy đủ, nhưng bạn có thể thay đổi bằng cách sử dụng rewrite rule.
Bước 7: Thiết lập rewrite rule
Nếu muốn người dùng truy cập vào trang About Us mà không cần nhập đuôi .html
, bạn sẽ cần tạo một quy tắc riêng. Bắt đầu bằng cách mở file .htaccess
:
$ sudo vi /var/www/html/.htaccess
Sau dòng RewriteEngine On
, thêm vào dòng sau:
RewriteRule ^about$ about.html [NC]
Lưu và thoát file.
Giờ đây bạn có thể truy cập vào trang About Us bằng URL http: // server_domain_or_IP/about
.
Kiểm tra rewrite rule:
^about$
đóng vai trò là pattern khớp với URL và user nhập vào trình duyệt. Hướng dẫn này sử dụng một vài metacharacter (siêu kí tự) như sau:
^
cho biết điểm bắt đầu của URL, sau đóserver_domain_or_IP
bị loại bỏ.&
là kết thúc của URL.
about.html
hiển thị đường dẫn đến file mà Apache phục vụ khi gặp pattern phù hợp.
[NC]
là cờ hướng dẫn rewrite rule không phân biệt chữ hoa, chữ thường để người dùng có thể nhập cả chữ hoa và chữ thường vào URL. Ví dụ, các URL sau đều trỏ đến file about.html
:
server_domain_or_IP
/aboutserver_domain_or_IP
/Aboutserver_domain_or_IP
/ABOUT
Một số ví dụ mẫu về rewrite rule
Khi đã hiểu cơ bản về các rewrite rule, bạn sẽ xem hai ví dụ trong phần này để nắm rõ hơn về cách thực hiện:
Ví dụ 1: Đơn giản hóa chuỗi truy vấn bằng rewrite rule
Các ứng dụng web thường sử dụng các chuỗi truy vấn, được thêm vào một URL bằng cách sử dụng kí tự ?
và phân tách bằng kí tự &
. Apache bỏ qua hai kí tự này khi khớp các rewrite rule. Tuy nhiên, đôi khi vẫn cần các chuỗi truy vấn để truyền dữ liệu giữa các trang. Ví dụ, URL cho trang tìm kiếm kết quả viết bằng PHP như sau:
http://example.com/results.php?item=shoes&type=women
Thay vào đó, bạn có thể sử dụng URL khác như sau:
http://example.com/shoes/women
Bạn có thể sử dụng hai cách để đạt được kết quả trên, bằng cách sử dụng tùy chọn thay thế hoặc kết hợp đơn giản.
Thay thế đơn giản
Bạn sẽ tạo một rewrite rule để đơn giản hóa một URL truy vấn dài:
RewriteRule ^shoes/women$ results.php?item=shoes&type=women
Tùy chọn kết hợp
Trong một số trường hợp, bạn có thể khái quát hóa chuỗi truy vấn bằng cách sau:
- Chỉ định một loạt các tùy chọn bằng cách sử dụng
|
, toán tử Boolean “OR”. - Nhóm đối sánh bằng cách sử dụng
()
, sau đó tham chiếu nhóm bằng biến$1
, với1
cho nhóm đầu tiên.
Rewrite rule trở thành:
RewriteRule ^shoes/(men|women|youth) results.php?item=shoes&type=$1
Quy tắc được hiển thị ở trên khớp với một URL shoes/ với phần theo sau là một type cụ thể. URL ban đầu được sửa đổi từ:
http://example.com/shoes/men
Thành:
http://example.com/results.php?item=shoes&type=men
Tùy chọn này cho phép Apache đánh giá một pattern mà không phải tạo rewrite rule riêng cho từng mẫu.
Khớp các bộ kí tự
Khi muốn chỉ định bất kì mục nào, không chỉ giới hạn ở mục /shoes
, bạn có thể làm như sau:
- Viết một regular expression khớp với tất cả các kí tự chữ và số. Biểu thức trong ngoặc
[]
khớp với bất kì kí tự nào bên trong và+
khớp với số lượng kí tự được chỉ định. - Nhóm kết quả phù hợp và tham chiếu với tư cách là biến
$2
trong file.
RewriteRule ^([A-Za-z0-9]+)/(men|women|youth) results.php?item=$1&type=$2
Ví dụ trên sẽ chuyển đổi:
http://example.com/pants/men
Thành:
http://example.com/results.php?item=pants&type=men
Bạn đã mở rộng thành công khả năng đối sánh bao gồm nhiều dạng của một URL.
Truyền chuỗi truy vấn
Cũng vẫn sử ví dụ trên, tuy nhiên trong trường hợp này, bạn muốn chuyển hướng http:// example.com/pants/men
nhưng vẫn muốn thêm một chuỗi truy vấn bổ sung ?page=2
. Lúc này, bạn sẽ ánh xạ URL sau:
http://example.com/pants/men?page=2
Đến:
http://example.com/results.php?item=pants&type=men&page=2
Nếu bạn cố gắng truy cập URL bằng cài đặt hiện tại thì sẽ thấy chuỗi truy vấn page=2
bị mất. Điều này có thể khắc phục bằng cách sử dụng cờ bổ sung QSA
để kết hợp chúng. Sửa đổi rewrite rule như sau:
RewriteRule ^([A-Za-z0-9]+)/(men|women|youth) results.php?item=$1&type=$2 [QSA]
Ví dụ 2: Thêm điều kiện bằng logic
Bây giờ bạn sẽ sử dụng directive RewriteCond
. Nếu một rewrite condition được đánh giá là đúng, Apache sẽ xem xét RewriteRule
kèm theo theo sau đó.
Trang mặc định
Ở trên, bạn đã thấy Apache xử lí yêu cầu về một URL không hợp lệ bằng cách cung cấp trang 404 Not Found. Tuy nhiên, thay vì hiển thị trang này thì bạn có thể chuyển hướng tất cả các URL sai định dạng về trang chủ. Đầu tiên kiểm tra xem file được yêu cầu có tồn tại hay không:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^admin/(.*)$ /admin/home
Lệnh trên sẽ chuyển hướng từ /admin/random_text
thành /admin/home
.
Rule trên quy định như sau:
%{REQUEST_FILENAME}
: Kiểm tra chuỗi được yêu cầu.- Toán tử
!-f
: Nếu filename được yêu cầu không tồn tại thì hãy thực hiện rewrite rule sau. RewriteRule
chuyển hướng các yêu cầu trở lại/admin/home
.
Tạo rule ErrorDocument để trỏ lỗi 404 về trang error.html
:
ErrorDocument 404 /error.html
Như vậy bất kỳ request nào dẫn đến phản hồi HTTP 404 đều sẽ được rule trên chuyển hướng về trang error.html
Hạn chế địa chỉ IP
Một RewriteCond
có thể sử dụng để cho phép truy cập vào trang web bằng một địa chỉ IP cụ thể.
Lệnh dưới đây chặn lưu lượng từ mọi nơi ngoại trừ 198.51.100.24:
RewriteCond %{REMOTE_ADDR} !^(198\.51\.100\.24)$
RewriteRule (.*) - [F,L]
Quy tắc trên chỉ rằng nếu địa chỉ IP yêu cầu tài nguyên không phải là 198.51.100.24 thì không cho phép truy cập.
Nói ngắn gọn như sau:
%{REMOTE_ADDR}
: Là chuỗi địa chỉ IP.!^(198\.51\.100\.24)$
: Phủ nhận địa chỉ IP (tạm hiểu là khác với giá trị này). Dấu gạch chéo\
này để ngăn kích hoạt phần.
mở rộng.- Cờ
F
cấm truy cập và cờL
chỉ ra rằng đây là quy tắc đặt cuối cùng để chạy.
Nếu bạn muốn chặn quyền truy cập từ địa chỉ cụ thể, hãy sử dụng cách sau:
RewriteCond %{REMOTE_ADDR} ^(198\.51\.100\.24)$
RewriteRule (.*) - [F,L]
Mặc dù bạn có thể sử dụng các phương pháp khác để chặn hoặc cho phép lưu lượng truy cập vào trang web của mình nhưng thiết lập hạn chế trong file .htaccess
là cách đơn giản nhất để đạt được những kết quả này.
Với hơn 10 năm kinh nghiệm trong lĩnh vực cung cấp giải pháp lưu trữ VPS, Vietnix đã phục vụ cho hơn 50.000 khách hàng cá nhân, doanh nghiệp, tiêu biểu như GTV, UB Group, iVIVU, SEOSONA, SAGO Media. Kể từ khi thành lập, Vietnix đã kích hoạt hơn 100.000 dịch vụ và giành được giải thưởng Thương hiệu Việt Nam xuất sắc năm 2022 nhờ những cống hiến không ngừng nghỉ của mình.
Vietnix cam kết mang đến cho khách hàng của mình những giải pháp hiệu quả và chất lượng, với đội ngũ kỹ thuật viên chuyên nghiệp, luôn sẵn sàng hỗ trợ khách hàng 24/7. Với vị thế một trong những nhà cung cấp giải pháp VPS hàng đầu tại Việt Nam, Vietnix luôn cập nhật công nghệ mới nhất và nâng cao chất lượng dịch vụ của mình để đáp ứng nhu cầu ngày càng cao của khách hàng. Hãy để Vietnix đồng hành cùng sự thành công của bạn trên con đường kinh doanh trực tuyến.
Mọi vấn đề thắc mắc cần tư vấn, quý khách vui lòng liên hệ:
- Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh
- Hotline: 1800 1093 – 07 088 44444
- Email: sales@vietnix.com.vn
Lời kết
Trong hướng dẫn này, bạn đã sử dụng một file .htaccess
để làm việc với các directive RewriteRule
và RewriteCond
. Đây là một thành phần vô cùng quan trọng trên web server Apache để hỗ trợ bạn thực hiện các hoạt động khác. Chúc bạn cài đặt thành công và nếu gặp phải khó khăn nào, hãy để lại bình luận bên dưới để được hỗ trợ nhanh chóng nhất.