Thứ bảy, 27/06/2015 | 00:00 GMT+7

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 module mod_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/.htaccess
RewriteEngine 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/.htaccess
RewriteRule ^about$ about.html [NC]

Tệp của bạn bây giờ sẽ giống như sau.

/var/www/html/.htaccess
RewriteEngine 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 khi example.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/.htaccess
RewriteRule ^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ới 1 cho group được so khớp đầu tiên

Luật Viết lại bây giờ trở thành:

/var/www/html/.htaccess
RewriteRule ^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/.htaccess
RewriteRule ^([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/.htaccess
RewriteRule ^([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/.htaccess
RewriteCond %{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/.htaccess
ErrorDocument 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/.htaccess
RewriteCond %{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/.htaccess
RewriteCond %{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 1phầ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.


Tags:

Các tin liên quan

Cách cài đặt Apache Tomcat 8 trên CentOS 7
2015-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