Cách thiết lập mod_rewrite cho Apache trên Ubuntu 14.04
Trong hướng dẫn này, ta sẽ kích hoạt và tìm hiểu cách quản lý việc ghi lại URL bằng modulemod_rewrite
của Apache2. Công cụ này cho phép ta viết lại các URL theo cách gọn gàng hơn, dịch các đường dẫn mà con người có thể đọc được thành các chuỗi truy vấn thân thiện với mã. Hướng dẫn này được chia thành hai nửa: phần đầu tiên cài đặt một ứng dụng web mẫu và phần thứ hai giải thích các luật viết lại thường được sử dụng.
Yêu cầu
Để làm theo hướng dẫn này, bạn cần :
- Một server Ubuntu 14.04 mới
- User sudo không phải root, bạn có thể cài đặt theo các bước 2 và 3 của hướng dẫn này
Bước 1 - Cài đặt Apache
Trong bước này, ta sẽ sử dụng một trình cài đặt gói tích apt-get
tên là apt-get
. Nó đơn giản hóa việc quản lý một cách đáng kể và tạo điều kiện cho việc cài đặt sạch sẽ.
Đầu tiên, hãy cập nhật index gói của hệ thống. Điều này sẽ đảm bảo các gói cũ hoặc lỗi thời không can thiệp vào quá trình cài đặt.
- sudo apt-get update
Apache2 là server HTTP nói trên và được sử dụng phổ biến nhất trên thế giới. Để cài đặt nó, hãy chạy như sau:
- sudo apt-get install apache2
Để biết thông tin về sự khác biệt giữa Nginx và Apache2, hai web server nguồn mở phổ biến nhất, hãy xembài viết này .
Bước 2 - Bật mod_rewrite
Bây giờ, ta cần kích hoạt mod_rewrite
.
- sudo a2enmod rewrite
Thao tác này sẽ kích hoạt module hoặc thông báo cho bạn rằng module đã có hiệu lực. Để những thay đổi này có hiệu lực, hãy khởi động lại Apache.
- sudo service apache2 restart
Bước 3 - Cài đặt .htaccess
Trong phần này, ta sẽ cài đặt .htaccess
để quản lý luật viết lại đơn giản hơn.
Tệp .htaccess
cho phép ta sửa đổi các luật viết lại của bạn mà không cần truy cập file cấu hình server . Vì lý do này, .htaccess
rất quan trọng đối với bảo mật ứng dụng web của bạn. Dấu chấm đứng trước tên file đảm bảo file được ẩn.
Ta cần cài đặt và bảo mật một vài cài đặt nữa trước khi có thể bắt đầu.
Đầu tiên, cho phép các thay đổi trong .htaccess
. Mở file cấu hình Apache mặc định bằng nano
hoặc editor yêu thích của bạn.
- sudo nano /etc/apache2/sites-enabled/000-default.conf
Bên trong file đó, bạn sẽ tìm thấy khối <VirtualHost *:80>
trên dòng 1. Bên trong khối đó, thêm khối sau:
/etc/apache2/sites-available/default<Directory /var/www/html> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory>
Tệp của bạn bây giờ sẽ trùng với những thứ sau. Đảm bảo rằng tất cả các khối đều được thụt lề đúng cách.
/etc/apache2/sites-available/default<VirtualHost *:80> <Directory /var/www/html> . . . </Directory> . . . </VirtualHost>
Để những thay đổi này có hiệu lực, hãy khởi động lại Apache.
- sudo service apache2 restart
Bây giờ, hãy tạo .htaccess
.
- sudo nano /var/www/html/.htaccess
Thêm dòng đầu tiên này ở đầu file mới để kích hoạt RewriteEngine
.
/var/www/html/.htaccessRewriteEngine on
Lưu và thoát khỏi file .
Để đảm bảo những user khác chỉ có thể đọc .htaccess
của bạn, hãy chạy lệnh sau để cập nhật quyền.
- sudo chmod 644 /var/www/html/.htaccess
Đến đây bạn có một .htaccess
hoạt động, để quản lý các luật định tuyến của ứng dụng web của bạn.
Bước 4 - Cài đặt file
Trong phần này, ta sẽ cài đặt một trình ghi lại URL cơ bản, giúp chuyển đổi các URL đẹp thành các đường dẫn thực tế đến mã. Cụ thể, ta sẽ cho phép user truy cập example.com /about
.
Ta sẽ bắt đầu bằng cách tạo một file có tên about.html
.
- sudo nano /var/www/html/about.html
Sao chép đoạn mã sau vào trang HTML.
/var/www/html/about.html<html> <head> <title>About Us</title> </head> <body> <h1>About Us</h1> </body> </html>
Bạn có thể truy cập ứng dụng web của bạn tại your_server_ip /about.html
hoặc example.com /about.html
. Bây giờ lưu ý chỉ about.html
có thể truy cập được; nếu bạn cố gắng truy cập your_server_ip /about
, bạn sẽ gặp lỗi Không tìm thấy . Thay vào đó ta muốn user truy cập about
. Các luật viết lại của ta sẽ cho phép chức năng này.
Mở .htaccess
.
- sudo nano /var/www/html/.htaccess
Sau dòng đầu tiên, thêm dòng sau.
/var/www/html/.htaccessRewriteRule ^about$ about.html [NC]
Tệp của bạn bây giờ sẽ giống như sau.
/var/www/html/.htaccessRewriteEngine on RewriteRule ^about$ about.html [NC]
Xin chúc mừng. Đến đây bạn có thể truy cập example.com /about
trong trình duyệt của bạn !
Đây là một ví dụ đơn giản tốt cho thấy cú pháp chung mà tất cả các Luật viết lại tuân theo.
^about$
là chuỗi được so khớp từ URL. Đó là những gì người xem nhập vào trình duyệt của cô ấy. Ví dụ của ta sử dụng một vài siêu ký tự .
-
^
cho biết phần bắt đầu của URL, sau khiexample.com /
bị loại bỏ. -
$
cho biết phần cuối của URL -
about
trùng với chuỗi “about”
about.html
là đường dẫn thực mà user truy cập; nghĩa là, Apache sẽ vẫn phục vụ file about.html
.
[NC]
là một cờ bỏ qua viết hoa trong URL.
Với luật được hiển thị ở trên, các URL sau sẽ trỏ đến about.html
:
-
example.com /about
-
example.com /About
-
example.com /about.html
Những điều sau đây sẽ không:
-
example.com /about/
-
example.com /contact
Các mẫu chung
Trong phần này, ta sẽ hiển thị một số chỉ thị thường được sử dụng.
Ứng dụng web của bạn hiện đang chạy và được quản lý bởi .htaccess
được bảo vệ. Ví dụ đơn giản nhất đã được bao gồm ở trên. Ta sẽ khám phá thêm hai ví dụ trong phần này.
Bạn có thể cài đặt các file ví dụ tại đường dẫn kết quả nếu bạn muốn, nhưng hướng dẫn này không bao gồm việc tạo file HTML và PHP; chỉ là các luật viết lại.
Ví dụ 1: Đơn giản hóa chuỗi truy vấn với RewriteRule
Tất cả các RewriteRule
tuân theo định dạng sau:
RewriteRule pattern substitution [flags]
- RewriteRule : chỉ định chỉ thị
RewriteRule
- pattern : một biểu thức chính quy trùng với chuỗi mong muốn
- thay thế : đường dẫn đến URL thực
- cờ : tham số tùy chọn có thể sửa đổi luật
Các ứng dụng web thường sử dụng chuỗi truy vấn , được nối vào URL bằng cách sử dụng ?
dấu chấm hỏi và được phân tách bằng dấu &
ampersand. Chúng bị bỏ qua khi khớp luật viết lại. Tuy nhiên, đôi khi các chuỗi truy vấn có thể được yêu cầu để chuyển dữ liệu giữa các trang. Ví dụ: một trang kết quả tìm kiếm được viết bằng PHP có thể sử dụng một số thứ tương tự như sau:
http://example.com/results.php?item=shirt&season=summer
Trong ví dụ này, ta muốn đơn giản hóa điều này để trở thành:
http://example.com/shirt/summer
Ví dụ 1A: Thay thế Đơn giản
Sử dụng luật viết lại, ta có thể sử dụng như sau:
/var/www/html/.htaccessRewriteRule ^shirt/summer$ results.php?item=shirt&season=summer
Ở trên khá dễ hiểu, vì nó thực sự ánh xạ shirt/summer
với results.php?item=shirt&season=summer
. Điều này đạt được hiệu quả mong muốn của ta .
Ví dụ 1B: Tùy chọn Kết hợp
Tuy nhiên, ta muốn tổng quát điều này bao gồm tất cả các mùa. Vì vậy, ta sẽ làm như sau:
- Chỉ định một loạt các tùy chọn bằng cách sử dụng
|
boolean, nghĩa là "HOẶC" - Group trận đấu bằng cách sử dụng
()
, sau đó tham chiếu group bằng cách sử dụng$1
, với1
cho group được so khớp đầu tiên
Luật Viết lại bây giờ trở thành:
/var/www/html/.htaccessRewriteRule ^shirt/(summer|winter|fall|spring) results.php?item=shirt&season=$1
Luật hiển thị ở trên trùng với URL của shirt/
theo sau là một mùa cụ thể. Phần đó được group bằng cách sử dụng ()
và sau đó được tham chiếu với $1
trong đường dẫn tiếp theo. Điều này nghĩa là , ví dụ, rằng:
http://example.com/shirt/winter
trở thành:
http://example.com/results.php?item=shirt&season=winter
Điều này cũng đạt được hiệu quả mong muốn.
Ví dụ 1C: Đối sánh các bộ ký tự
Tuy nhiên, ta cũng muốn chỉ định bất kỳ loại mặt hàng nào, không chỉ URL tại /shirt
. Vì vậy, ta sẽ làm như sau:
- Viết một biểu thức chính quy phù hợp với tất cả các ký tự chữ và số. Biểu thức dấu ngoặc
[]
trùng với bất kỳ ký tự nào bên trong và+
trùng với bất kỳ số ký tự nào được chỉ định trong dấu ngoặc - Group đối sánh và tham chiếu nó với
$2
làm biến thứ hai trong file
/var/www/html/.htaccessRewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2
Ở trên sẽ chuyển đổi, ví dụ:
http://example.com/pants/summer
đến:
http://example.com/results.php?item=pants&season=summer
Ví dụ 1D: Truyền chuỗi truy vấn
Phần này không giới thiệu bất kỳ khái niệm mới nào nhưng giải quyết một vấn đề có thể phát sinh. Sử dụng ví dụ trên, giả sử ta muốn chuyển hướng http://example.com/pants/summer
nhưng sẽ chuyển một chuỗi truy vấn bổ sung ?page=2
. Ta muốn những điều sau:
http://example.com/pants/summer?page=2
để ánh xạ đến:
http://example.com/results.php?item=pants&season=summer&page=2
Nếu bạn cố gắng truy cập URL ở trên với cài đặt hiện tại của ta , bạn sẽ thấy rằng chuỗi truy vấn page=2
đã bị mất. Điều này có thể dễ dàng khắc phục bằng cách sử dụng cờ QSA
bổ sung. Sửa đổi luật viết lại để phù hợp với luật sau và hành vi mong muốn sẽ đạt được.
/var/www/html/.htaccessRewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]
Ví dụ 2: Thêm điều kiện với Logic
RewriteCond
cho phép ta thêm các điều kiện vào các luật viết lại của ta . Tất cả các RewriteCond
tuân theo định dạng sau:
RewriteCond TestString Condition [Flags]
- RewriteCond : chỉ định chỉ thị
RewriteCond
- TestString : chuỗi để kiểm tra
- Điều kiện : mẫu phù hợp
- Cờ : các thông số tùy chọn có thể sửa đổi điều kiện
Nếu RewriteCond
đánh giá là true, thì RewriteRule
ngay sau đó sẽ được xem xét.
Ví dụ 2A: Trang mặc định
Trong bảng quản trị tưởng tượng, ta có thể cần hướng tất cả các URL không đúng định dạng trở lại trang chủ, thay vì chào user bằng 404. Sử dụng một điều kiện, ta có thể kiểm tra xem file được yêu cầu có tồn tại hay không.
/var/www/html/.htaccessRewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^admin/(.*)$ /admin/home
Điều này sẽ chuyển hướng thông tin như /admin/blargh
đến /admin/home
.
Với những điều trên:
-
%{REQUEST_FILENAME}
là chuỗi cần kiểm tra -
!-f
sử dụng!
không phải toán tử trên tên file -
RewriteRule
chuyển hướng tất cả các yêu cầu trở lại/admin/home
Lưu ý một cách tiếp cận cú pháp hơn và đúng kỹ thuật sẽ được xác định 404 ErrorDocument
.
/var/www/html/.htaccessErrorDocument 404 /error.html
Ví dụ 2B: Hạn chế truy cập IP
Mặc dù điều này cũng có thể đạt được bằng cách sử dụng các phương pháp khác, RewriteCond
được dùng để hạn chế quyền truy cập vào một IP hoặc một tập hợp các địa chỉ IP.
Ví dụ này chặn lưu lượng truy cập từ mọi nơi ngoại trừ 12.34.56.789.
/var/www/html/.htaccessRewriteCond %{REMOTE_ADDR} !^(12\.34\.56\.789)$ RewriteRule (.*) - [F,L]
Ví dụ này chỉ đơn giản là phủ định của Ví dụ 3 từ bài viết mod_rewrite cũ . Toàn bộ câu lệnh ghi "nếu địa chỉ không phải là 12.34.56.789, không cho phép truy cập."
Nói ngắn gọn:
-
%{REMOTE_ADDR}
là chuỗi địa chỉ -
!^(12\.34\.56\.789)$
thoát khỏi tất cả.
dấu chấm với\
dấu gạch chéo ngược và phủ định địa chỉ IP đang sử dụng!
- Cờ
F
cấm truy cập và cờL
cho biết đây là luật cuối cùng để chạy, nếu được thực thi
Nếu bạn muốn chặn 12.34.56.789, hãy sử dụng điều này thay thế:
/var/www/html/.htaccessRewriteCond %{REMOTE_ADDR} ^(12\.34\.56\.789)$ RewriteRule (.*) - [F,L]
Bạn có thể tìm thêm luật viết lại và cách ngăn chặn liên kết nóng, trong phần 1 và phần 2 của bài viết root .
Kết luận
mod_rewrite
được dùng hiệu quả đảm bảo con người có thể đọc được URL. Tuy nhiên, bản thân file .htaccess
có nhiều công dụng hơn là chỉ đơn giản là module này và cần lưu ý nhiều module Apache khác có thể được cài đặt để mở rộng chức năng của nó.
Có các tài nguyên khác trình bày chi tiết các khả năng của mod_rewrite
:
mod_rewrite
là một module quan trọng đối với bảo mật ứng dụng web, nhưng đôi khi có thể kết thúc bằng các vòng lặp chuyển hướng hoặc 500 forbidden
lỗi 500 forbidden
phổ biến, không rõ ràng. Để biết các mẹo gỡ lỗi .htaccess
, hãy xem bài đăng StackOverflow này .
Luật viết lại được viết bằng biểu thức chính quy. Để trở thành chuyên gia, hãy tham khảo hướng dẫn này về tất cả các biểu thức chính quy .
Để phân tích nhanh các mẫu biểu thức chính quy của bạn, đây là trình gỡ lỗi trực tuyến có thể cung cấp phản hồi ngay lập tức và diễn giải trực tiếp các mẫu biểu thức chính quy của bạn.
Các tin liên quan
Cách cài đặt Apache Tomcat 8 trên CentOS 72015-06-19
Cách cài đặt Apache Tomcat 8 trên Ubuntu 14.04
2015-06-19
Cách tạo chứng chỉ SSL trên Apache cho Debian 8
2015-06-19
Cách cài đặt Apache Tomcat 7 trên CentOS 7 qua Yum
2015-06-15
Cách cấu hình Apache để sử dụng các trang lỗi tùy chỉnh trên Ubuntu 14.04
2015-06-09
Cách cấu hình Apache để sử dụng các trang lỗi tùy chỉnh trên CentOS 7
2015-06-09
Cách thiết lập ModSecurity với Apache trên Ubuntu 14.04 và Debian 8
2015-06-05
Cách chạy trang web Django với Apache, mod_wsgi và MySQL trên FreeBSD 10.1
2015-05-29
Cách chuyển hướng www thành không có www bằng Apache trên Ubuntu 14.04
2015-05-04
Cách chuyển hướng www thành không có www bằng Apache trên CentOS 7
2015-05-04