Bật mod_rewrite trong Ubuntu

Sau khi cài đặt xong server LAMP, bạn có thể kiểm tra cấu hình server bằng cách chạy 1 file PHP có chứa lệnh phpinfo();, bạn sẽ thấy mod_rewrite mặc định chưa được bật. Vì vậy, trong bài viết này chúng ta sẽ xem cách khởi động mod này.

Cấu hình Apache với mod_rewrite


Các file cấu hình của Apache2 được lưu trữ trong Ubuntu tại địa chỉ /etc/apache2, trong này bạn sẽ thấy:

-rw-r--r-- 1 root root 10406 2008-11-11 00:18 apache2.conf
-rw-r--r-- 1 root root 10398 2008-11-11 00:16 apache2.conf~
drwxr-xr-x 2 root root  4096 2008-11-08 17:58 conf.d
-rw-r--r-- 1 root root   895 2008-02-04 23:26 envvars
-rw-r--r-- 1 root root     0 2008-11-08 17:58 httpd.conf
drwxr-xr-x 2 root root  4096 2008-11-08 18:01 mods-available
drwxr-xr-x 2 root root  4096 2008-11-10 17:20 mods-enabled
-rw-r--r-- 1 root root    59 2008-02-04 23:26 ports.conf
drwxr-xr-x 2 root root  4096 2008-11-10 21:20 sites-available
drwxr-xr-x 2 root root  4096 2008-11-08 17:58 sites-enabled

Ở đây có 2 thư mục mods-availablemods-enabled cần xem xét. Thư mục mods-available dùng để lưu trữ các mod (chính xác là các file cấu hình các mod) có sẵn, đi kèm khi cài đặt Apache2; còn thư mục mods-enabled chứa các mod đã được bật. Truy cập vào thư mục mods-available và thử mở 1 file nào đó, bạn sẽ thấy 1 dòng đại loại như:

LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

Đó là dòng dùng để báo cho Apache2 biết nạp module (trong trường hợp này là mod_rewrite) ở địa chỉ nào. Theo dấu vết này, bạn có thể lần ra các file modules (*.so) được lưu ở địa chỉ /usr/lib/apache2/modules/.

Còn truy cập vào thư mục mods-enabled, bạn sẽ chỉ thấy toàn các symbolic links, các links này sẽ liên kết tới 1 file tương ứng trong thư mục mods-available:

lrwxrwxrwx 1 root root 29 2008-11-08 17:58 status.load -> ../mods-available/status.load

Bây giờ để bật 1 module nào đó cho Apache2, chúng ta sẽ dùng 1 lệnh có sẵn của Ubuntu: a2enmod. Để bật mod_rewrite, câu lệnh của chúng ta sẽ là:

sudo a2enmod rewrite
sudo /etc/init.d/apache2 restart

Lệnh thứ 2 chỉ đơn thuần là khởi động lại Apache2 để nó nhận diện được mod_rewrite.

Bây giờ, hãy thử gõ lệnh a2enmod một mình, không có tham số, bạn sẽ nhận được 1 danh sách liệt kê các modules được hỗ trợ, và 1 câu hỏi chọn tên của module cần bật. Điều này có lợi nếu bạn muốn xét duyệt qua tất cả các module mà không cần phải nhớ tên của chúng. Muốn bật module nào chỉ cần gõ tên của nó nhìn từ danh sách và Enter là xong. Chú ý phải dùng sudo thì mới có quyền bật module được.

Tương ứng với lệnh a2enmod sẽ có lệnh a2dismod dùng để tắt 1 module nào đó. Câu lệnh thực hiện cũng tương tự, VD đối với mod_rewrite sẽ là:

sudo a2dismod rewrite
sudo /etc/init.d/apache2 restart

Tất nhiên, bạn cũng có thể gõ lệnh a2dismod một mình để có được danh sách các module đã được bật, để chọn 1 module cần tắt dễ dàng hơn mà không cần phải nhớ tên của nó.

Bây giờ ta hãy xem thử man của các lệnh này, hãy gõ

man a2enmod

bạn sẽ thấy lệnh a2enmod chỉ đơn thuần tạo 1 symbolic link trong thư mục mods-enabled tương ứng với 1 file trong thư mục mods-available, và lệnh a2dismod thì làm ngược lại, xoá symbolic link đó đi. Điều này sẽ khiến chúng ta hiểu về cách hoạt động cũng như cấu trúc của 2 thư mục cấu hình Apache2 như phần phân tích ở đầu bài viết.

Nhờ những hiểu biết này, bạn có thể bật, tắt mod_rewrite và các module khác bằng các lệnh thông thường như sau:

sudo ln -s ../mods-available/rewrite.load
sudo /etc/init.d/apache2 restart

sudo rm rewrite.load
sudo /etc/init.d/apache2 restart

ở đây lệnh ln dùng để tạo 1 link đến 1 file, tham số -s ám chỉ symbolic link.

Nếu muốn tìm hiểu sâu hơn 1 chút nữa, bạn hãy mở file apache2.conf ra, file này dùng để lưu trữ cấu hình của Apache2. Đọc nó bạn sẽ thấy:

# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

Bạn cũng sẽ hiểu là Apache sẽ đơn thuần include các file *.load*.conf trong thư mục mods-enabled vào cấu hình của mình. Các file này thực chất là các symbolic links đến các file trong thư mục mods-available, và chúng sẽ chứa dòng cấu hình chi tiết của từng module.

Còn gì nữa?


Sau khi nghiên cứu các cách bật mod_rewrite ở trên, bạn chạy lại file PHP có chứa lệnh phpinfo();, bạn sẽ thấy mod_rewrite được bật. Hãy thử thí nghiệm 1 vài dòng trong file .htaccess để thực thi mod_rewrite như thế này (hãy lưu file .htaccess tại thư mục /var/www - thư mục chứa các file chạy của Apache2):

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^info$ /phpinfo.php [L]
</IfModule>

rồi chạy http://localhost/info (giả sử file chứa lệnh phpinfo();phpinfo.php) thì bạn sẽ không nhận được gì ngoài 1 thông báo lỗi. Tức là mod_rewrite chưa hoạt động. Tại sao?

Lí do là vì chúng ta thực hiện việc rewrite thông qua file .htaccess, mà Apache2 có quyền bỏ qua hay thực thi 1 số quy tắc trong file .htaccess này. Việc bỏ qua hay thực thi được thực hiện nhờ thuộc tính AllowOverride. Thuộc tính này có các giá trị:

None: nghĩa là file .htaccess sẽ không ghi đè lên các cấu hình trước đó, điều này tương đồng với việc .htaccess không làm gì cả, nó sẽ bị bỏ qua và quy tắc rewrite của chúng ta tất nhiên cũng trôi theo dòng nước.

AuthConfig: file .htaccess sẽ ghi đè các quy tắc liên quan đến việc xác thực, nó có ích nếu bạn muốn dùng mật khẩu để bảo vệ 1 thư mục nào đó.

FileInfo: file .htaccess sẽ ghi đè các quy tắc liên quan đến các kiểu file.

All: file .htaccess sẽ ghi đè toàn bộ những gì nó có lên cấu hình mặc định, nghĩa là thực thi toàn bộ những gì ta viết trong file .htaccess.

Các thuộc tính này còn khá nhiều, bạn có thể xem mô tả chi tiết ở trang chủ của Apache2.

Như vậy vấn đề của chúng ta là thuộc tính AllowOverride, nó đã bị tắt ở đâu đó trong cấu hình của Apache2. Lục lọi trong các file, thư mục của Apache2 (/etc/apache2), bạn sẽ thấy 2 thư mục sites-availablesites-enabled, và vào sâu trong nó, bạn sẽ thấy 1 quy tắc quen thuộc: các file trong sites-enabled là symbolic link tới các file trong sites-available. Điều này có liên quan tới việc từ 1 host (là máy tính của bạn) tạo ra nhiều website cùng chạy, các bạn có thể tìm kiếm trên Google với từ khoá VirtualHost, hoặc xem chi tiết tại trang chủ của Apache2. Tuy nhiên trong trường hợp đơn giản, khi mà máy tính của bạn chỉ chạy 1 website là localhost, thì bạn sẽ thấy chỉ có 1 file default trong thư mục mods-available. Đó chính là file chứa cấu hình website của chúng ta, hãy mở nó ra, bạn sẽ thấy:

DocumentRoot /var/www/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
# This directive allows us to have apache2's default start page
# in /apache2-default/, but still have / go to the right place
#RedirectMatch ^/$ /apache2-default/
</Directory>

Ở đây bạn sẽ thấy có 2 thuộc tính AllowOverride, và chúng đều được cấu hình sẵn là None, tức là bỏ qua file .htaccess của chúng ta. Vì thế ta cần điều chỉnh chúng về All, tức là file .htaccess có đủ quyền để ghi đè lên các cấu hình có sẵn. Tuy nhiên, cần chú ý 1 điều là ở thuộc tính AllowOverride đầu tiên, nó được cấu hình cho thư mục gốc (/), nhận biết nó qua thuộc tính Directory ngay bên trên. Đó không phải là thư mục chạy web của chúng ta. Mặc định các file của website sẽ được lưu trữ tại thư mục /var/www, tức là tương ứng với Directory /var/www, và tất nhiên là thuộc tính AllowOverride thứ 2. Vì thế hãy chỉ điều chỉnh thuộc tính thứ 2 này là đủ.

Sau khi điều chỉnh xong, hãy khởi động lại Apache2 và thử http://localhost/info, bạn sẽ thấy mod_rewrite hoạt động hoàn hảo.

Như vậy, chúng ta đã hoàn tất việc khởi động module rewrite cho Apache2. Chúc các bạn có nhiều website hay, cũng như 1 cuối tuần vui vẻ.

1 nhận xét :