Thiết lập mod_rewrite cho Apache trên CentOS 7

6 năm trước

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:

/etc/httpd/conf.modules.d/00-base.conf
#
# 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:

/etc/httpd/conf/httpd.conf
. . .. . .
# 
# 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:

/var/www/html/.htaccess
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:

/var/www/html/about.html

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:

/var/www/html/.htaccess
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, khi server_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:

/var/www/html/.htaccess
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ới 1 đại diện cho URL khớp với men

Lệnh rewrite hoàn chỉnh:

/var/www/html/.htaccess
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 
/var/www/html/.htaccess
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