Thiết lập mod_rewrite cho Apache trên CentOS 7
Giới thiệu
Apache là một modular web server cho phép tùy chỉnh các tính năng bằng các module. Nó cho phép admin user điều chỉnh Apache cho phù hợp với ứng dụng Web mà nó cung cấp.
Bài viết sẽ hướng dẫn bạn cách cài Apache trên một CentOS 7 server, xác nhận module mod_rewrite
đã được kích hoạt và tìm hiểu một số tính năng của module này.
Yêu cầu
Trước hết bạn cần có một non-root user với quyền sudo. Tìm hiểu cách tạo một user như thế tại bài viết Thiết lập ban đầu cho server chạy Centos 7
Bước 1 – Cài đặt Apache
Ta sẽ cài Apache bằng yum
, tiện ích quản lí package mặc định của CentOS.
sudo yum install httpd
Khi nhận được tin phản hồi Is this ok [y/d/N]:
gõ Y
rồi ENTER
cho phép thực hiện quá trình cài đặt.
Tiếp theo, khởi động Apache Daemon, một tiến trình chạy độc lập cho phép tạo ra những tiến trình hoặc luồng con để xử lí yêu cầu với tiện ích systemctl
:
sudo systemctl start httpd
Kiểm tra trạng thái của Apache với lệnh status
sudo systemctl status httpd
Output
. . .
systemd[1]: Starting The Apache HTTP Server...
systemd[1]: Started The Apache HTTP Server.
Sau khi cài xong Apache, ta sẽ chuyển sang các module của nó.
Bước 2 – Kiểm tra mod_rewrite
Trên Centos 7, mod_rewrite
mặc định được kích hoạt. Ta sẽ kiểm tra lại nó bằng cách dùng lệnh httpd
với cờ -M
để in ra danh sách tất cả module đã được nạp :
httpd -M
Output. . .
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, kích hoạt nó bằng cách edit file 00-base.conf
với trình soạn thảo vi
:
sudo vi /etc/httpd/conf.modules.d/00-base.conf
Khi mở xong, gõ i
để vào insert mode, sau đó sủa file thành như sau:
#
# This file loads most of the modules included with the Apache HTTP
# Server itself.
#
. . .LoadModule rewrite_module modules/mod_rewrite.so. . .
Bấm ESC
để rời insert mode. Xong đó gõ :x
rồi ENTER
để lưu file và thoát.
Sau đó khởi động lại Apache
sudo systemctl restart httpd
Sau khi cài xong Apache và kích hoạt module mod_rewrite
, ta đã sẵn sàng để tiến hành cấu hình file .htaccess
.
Bước 3 – Thiết lập một File .htaccess
Một file .htaccess
cho phép định nghĩa một lệnh chỉ thị cho Apache, bao gồm một RewriteRule
, trên một per- domain basis mà không ảnh hưởng tới các file cấu hình của hệ thống. Trong Linux, những file này được đặt sau một dấu (.
) và bị ẩn.
Trước khi sử dụng file .htaccess
ta cần update cài đặt AllowOverride
để cho phép việc ghi đè lệnh trên Apache:
Mở file cấu hình của Apache:
sudo vi /etc/httpd/conf/httpd.conf
Tìm mục
rồi đổi giá trị của AllowOverride
từ None
thành All
:
. . .. . .
#
# 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. . . . . .
Lưu và thoát xong đó restart Apache
sudo systemctl restart httpd
Tiếp theo, tạo một file .htaccess
ở thư mục gốc /var/www/html
, mặc định cho Apache.
sudo vi /var/www/html/.htaccess
Thêm những dòng sau vào bên trên file để kích hoạt RewriteEngine
, cho phép Apache xử lí bất cứ lệnh nào đi kèm:
RewriteEngine On
Lưu và thoát.
Bước 4 – Cú pháp cuả một lệnh RewriteRule
Lệnh RewriteRule
cho phép ta chuyển các yêu càu đến Apache dựa trên URL. Một fiel.htaccess
có thể chứa một hoặc nhiều hơn một luật rewrite, nhưng tại run-time Apache chỉ áp dụng những luật đó theo thứ tự của chúng trong file.
Một lênh rewrite bao gồm:
RewriteRule Pattern Substitution [Flags]
- RewriteRule: chỉ rõ lệnh
RewriteRule
- Pattern: Một PCRE (Perl Compatible Regular Expression) khớp với chuỗi mong muốn.
- Substitution: nơi yêu cầu ghép được gửi.
- [Flags]: thông số bổ sung để thay đổi luật.
RewriteRule
là công cụ chính của lệnh mod_rewrite
, đó là lí do ta cần tập trung vào nó trong phần này.
Bước 5 – Cú pháp của một lệnh RewriteCond
Lệnh RewriteCond
cho phép thêm điều kiện vào luật rewrite. Một điều kiện rewrite bao gồm:
RewriteCond TestString Condition [Flags]
- RewriteCond: làm rõ lệnh
RewriteCond
- TestString: một chuỗi để test
- Condition: một pattern để khớp
- [Flags]: thông số tùy chọn để tùy chỉnh.
Lệnh RewriteCond
không cho phép Apache follow bất cứ luật rewrite nào không thỏa mãn điều kiện.
Bước 6 – Thiết lập File
Ta sẽ tạo một luật rewrite đơn giản cho phép user truy cập vào trang about.html
mà không cần gõ phần mở rộng (.html
) trên thanh địa chỉ của trình duyệt.
Bắt đầu bằng việc tạo file about.html
sudo vi /var/www/html/about.html
Copy đoạn code sau:
About Us
Lưu và thoát.
Trên trình duyệt web của mình, gõ:
http://server_domain_or_IP/about.html
Bạn sẽ thấy một trang trắng với dòng chữ About Us. Nếu xóa .html đi, bạn sẽ nhận được thông báo 404 Not Found error. Apache chỉ có thể truy cập vào các phần tử với tên đầy đủ của nó, nhưng ta có thể khắc phục bằng một luật rewrite đơn giản như sau.
Bước 7 – Thiết lập một RewriteRule
Mở file .htaccess
sudo vi /var/www/html/.htaccess
Sau dòng RewriteEngine On
thêm vào dòng:
RewriteRule ^about$ about.html [NC]
Lưu và đóng file
Giờ thì ta đã có thể truy cập vào file about.html bằng URL http://server_domain_or_IP/about
.
Giờ hãy phân tích kĩ luật rewrite vừa rồi.
^about$
cung cấp một pattern khớp URL với thứ người dùng gõ vào thanh đại chỉ.
Ví dụ ở đây sử dụng một cặp metacharacters để chắc chắc điều kiện chỉ có thể xảy ra trong một đoạn cụ thể của URL
^
biểu diễn phần đầu, khiserver_domain_or_IP/
bị cắt đi.&
nghĩa là đến cuối của URL
[NC]
là cờ cho phép luật rewrite có thể được thực hiện bất chấp việc giá trị nhập vào là viết hoa hay viết thường. Ví dụ, tất cả các URL sau đều trỏ tới file about.html
- serverdomainor_IP/about
- serverdomainor_IP/About
- serverdomainor_IP/ABOUT
Những Pattern thông thường
Xét 2 ví dụ về những pattern thông thường sau để hiểu hơn về chúng.
Ví dụ 1: Đơn giản hóa truy vấn chuỗi với một RewriteRule
Ứng dụng web sử dụng nhiều truy vấn chuỗi, thường được thêm vào URL với một dấu(?
) và được bỏ giới hạn bằng kí tự(&
). Apache không quan tâm đến những kí tự này khi ghép cặp với luật rewrite. tuy nhiên thỉnh thoảng những truy vấn chuỗi này đòi hỏi dữu liệu giữa các trang khác nhau. Chẳng hạn một URL cho kết qur của một truy vấn tìm kiếm là:
http://example.com/results.php?item=shoes&type=women
Thay vì thế, ta muốn URL giống như:
http://example.com/shoes/women
Có 2 cách để làm việc này: qua một phép thay thế đơn giản hoặc dùng điều kiện ghép( matching options )
Ví dụ 1A: Thay thế
Ta có thể tạo ra một luật rewite như thế này:
RewriteRule ^shoes/women$ results.php?item=shoes&type=women
Luật rewrite này chuyển URL thành shoes/women
từ results.php?item=shoes&type=women
.
Ví dụ 1B: Dùng matching option
Trong một vài trường hợp, ta muốn hiển thị rõ thêm thông tin về các loại giày khác nhau. Nếu dùng cách 1 ta sẽ phải thay thế thêm nhiều lầ với những truy vấn yêu cầu thông tin từ nhiều trang web. Thay vào đó ta có thể dùng cách sau:
- Đơn giản hóa chuỗi các tùy chọn sử dụng kí tự
|
để phân tách các tùy chọn - Nhóm chúng lại sử dụng dấu ngoặc
()
, rồi tham chiếu đến nhóm bằng biến$1
với1
đại diện cho URL khớp với men
Lệnh rewrite hoàn chỉnh:
RewriteRule ^shoes/(men|women|youth) results.php?item=shoes&type=$1
Luật này sẽ thay đổi URL sao cho với địa chỉ được nhập vào là:
http://example.com/shoes/men
sẽ trở thành:
http://example.com/results.php?item=shoes&type=men
Matching option trên cho phép Apache đánh giá các pattern khác nhau mà không cần tạo nhiều luật rewrite cho từng pattern.
Ví dụ 1C: Matching bộ kí tự
Nếu muốn làm rõ bất cứ đường dẫn nào chứ không chỉ là trong /shoes
, ta sẽ thực hiện các bước
- Viết một regular expression match tất cả kí tự chữ và số. Dấu ngoặc
[ ]
match tất cả kí tự trong nó, và+
match với bất kể số lượng nào của các kí tự trong ngoặc. - Nhóm các match lại, rồi tham chiếu đến nó bằng biến
$2
RewriteRule ^([A-Za-z0-9]+)/(men|women|youth) results.php?item=$1&type=$2
Những URL có dạng
http://example.com/pants/men
sẽ được chuyển thành
http://example.com/results.php?item=pants&type=men