Thứ năm, 22/08/2019 | 00:00 GMT+7

Cách viết lại URL bằng mod_rewrite cho Apache trên Debian 10

Mô-đun mod_rewrite của Apache cho phép bạn viết lại 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ã. Nó cũng cho phép bạn viết lại URL dựa trên các điều kiện.

Tệp .htaccess cho phép bạn tạo và áp dụng luật viết lại mà không cần truy cập file cấu hình server . Bằng cách đặt .htaccess vào folder root của trang web , bạn có thể quản lý các đoạn viết lại trên cơ sở từng trang hoặc từng folder .

Trong hướng dẫn này, bạn sẽ bật mod_rewrite và sử dụng các .htaccess để tạo chuyển hướng URL cơ bản, sau đó khám phá một vài trường hợp sử dụng nâng cao.

Yêu cầu

Để làm theo hướng dẫn này, bạn cần :

Bước 1 - Bật mod_rewrite

Để Apache hiểu các luật viết lại, trước tiên ta cần kích hoạt mod_rewrite . Nó đã được cài đặt, nhưng nó bị tắt trên cài đặt Apache mặc định. Sử dụng lệnh a2enmod để bật module :

  • sudo a2enmod rewrite

Thao tác này sẽ kích hoạt module hoặc thông báo cho bạn biết rằng module đã được bật. Để những thay đổi này có hiệu lực, hãy khởi động lại Apache:

  • sudo systemctl restart apache2

mod_rewrite hiện đã được kích hoạt hoàn toàn. Trong bước tiếp theo, ta sẽ cài đặt .htaccess mà ta sẽ sử dụng để xác định các luật viết lại cho chuyển hướng.

Bước 2 - Cài đặt .htaccess

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.

Lưu ý: Bất kỳ luật nào bạn có thể đặt trong .htaccess cũng có thể được đặt trực tiếp vào file cấu hình server . Trên thực tế, tài liệu Apache chính thức khuyến nghị sử dụng file cấu hình server thay vì .htaccess nhờ thời gian xử lý nhanh hơn.

Tuy nhiên, trong ví dụ đơn giản này, hiệu suất tăng sẽ không đáng kể. Ngoài ra, việc cài đặt các luật trong .htaccess rất tiện lợi, đặc biệt là với nhiều trang web trên cùng một server . Nó không yêu cầu khởi động lại server để các thay đổi có hiệu lực hoặc quyền root để chỉnh sửa luật , đơn giản hóa việc bảo trì và quy trình thực hiện thay đổi với account không có quyền . Phần mềm nguồn mở phổ biến như Wordpress và Joomla dựa vào .htaccess để thực hiện các sửa đổi và luật bổ sung theo yêu cầu.

Trước khi bắt đầu sử dụng .htaccess , bạn cần cài đặt và bảo mật một số cài đặt khác.

Theo mặc định, Apache cấm sử dụng .htaccess để áp dụng các luật viết lại, vì vậy trước tiên bạn cần cho phép các thay đổi đối với file . 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-available/000-default.conf

Bên trong file đó, bạn sẽ tìm thấy một khối <VirtualHost *:80> bắt đầu từ dòng đầu tiên. Bên trong khối đó, hãy thêm khối mới sau để file cấu hình của bạn trông giống như 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/000-default.conf
<VirtualHost *:80>     <Directory /var/www/html>         Options Indexes FollowSymLinks         AllowOverride All         Require all granted     </Directory>      . . . </VirtualHost> 

Lưu và đóng file . Nếu bạn sử dụng nano , hãy làm như vậy bằng cách nhấn CTRL+X , Y , sau đó ENTER .

Sau đó, kiểm tra cấu hình của bạn:

  • sudo apache2ctl configtest

Nếu không có lỗi, hãy khởi động lại Apache để các thay đổi có hiệu lực:

  • sudo systemctl restart apache2

Bây giờ, hãy tạo .htaccess trong folder root của web:

  • sudo nano /var/www/html/.htaccess

Thêm dòng này ở đầu file mới để kích hoạt công cụ viết lại.

/var/www/html/.htaccess
RewriteEngine on 

Lưu file và thoát.

Đến đây bạn có một .htaccess hoạt động mà bạn có thể sử dụng để điều chỉnh các luật định tuyến của ứng dụng web của bạn. Trong bước tiếp theo, ta sẽ tạo một file trang web mẫu mà ta sẽ sử dụng để chứng minh các luật viết lại.

Bước 3 - Cấu hình ghi lại URL

Ở đây, ta sẽ cài đặt một trình ghi lại URL cơ bản để chuyển đổi các URL đẹp thành đường dẫn thực tế đến các trang. Cụ thể, ta sẽ cho phép user truy cập http:// your_server_ip /about và hiển thị một trang có tên about.html .

Bắt đầu bằng cách tạo một file có tên about.html trong folder root của web:

  • sudo nano /var/www/html/about.html

Sao chép mã HTML sau vào file , sau đó lưu và đóng nó.

/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 trang này tại http:// your_server_ip /about.html , nhưng lưu ý nếu bạn cố gắng truy cập vào http:// your_server_ip /about , bạn sẽ thấy lỗi 404 Not Found . Để truy cập trang bằng cách sử dụng /about thay vào đó, ta sẽ tạo luật viết lại.

Tất cả các RewriteRules đều tuân theo định dạng sau:

Cấu trúc RewriteRule chung
RewriteRule pattern substitution [flags] 
  • RewriteRule chỉ định chỉ thị.
  • pattern là một biểu thức chính quy trùng với chuỗi mong muốn từ URL, là chuỗi mà người xem nhập vào trình duyệt.
  • substitution là đường dẫn đến URL thực, tức là đường dẫn của file mà Apache phân phát.
  • flags là các tham số tùy chọn có thể sửa đổi cách luật hoạt động.

Hãy tạo luật ghi lại URL của ta . Mở .htaccess :

  • sudo nano /var/www/html/.htaccess

Sau khi dòng đầu tiên, thêm dòng sau RewriteRule và lưu các file :

/var/www/html/.htaccess
RewriteEngine on RewriteRule ^about$ about.html [NC] 

Trong trường hợp này, ^about$ là mẫu, about.html là thay thế và [NC] là cờ. Ví dụ của ta sử dụng một vài ký tự có ý nghĩa đặc biệt:

  • ^ cho biết phần bắt đầu của URL, sau your_server_ip / .
  • $ cho biết phần cuối của URL.
  • about trùng với chuỗi “about”.
  • about.html là file thực mà user truy cập.
  • [NC] là một cờ làm cho luật không phân biệt chữ hoa chữ thường.

Như vậy, bạn có thể truy cập http:// your_server_ip /about trong trình duyệt của bạn . Trên thực tế, với luật được hiển thị ở trên, các URL sau cũng sẽ trỏ đến about.html :

  • http:// your_server_ip /about , do định nghĩa luật .
  • http:// your_server_ip /About , vì luật không phân biệt chữ hoa chữ thường.
  • http:// your_server_ip /about.html , vì tên file root sẽ luôn hoạt động.

Tuy nhiên, những điều sau sẽ không hoạt động:

  • http:// your_server_ip /about/ , bởi vì luật nói rõ rằng có thể không có gì sau about , vì ký tự $ xuất hiện sau about .
  • http:// your_server_ip /contact , vì nó sẽ không trùng với chuỗi about trong luật .

Đến đây bạn có một .htaccess hoạt động với luật cơ bản mà bạn có thể sửa đổi và mở rộng theo nhu cầu của bạn . Trong các phần sau, ta sẽ đưa ra hai ví dụ bổ sung về các lệnh thường được sử dụng.

Ví dụ 1 - Đơn giản hóa chuỗi truy vấn với RewriteRule

Các ứng dụng web thường sử dụng các chuỗi truy vấn , được nối vào URL bằng dấu chấm hỏi ( ? ) Sau địa chỉ. Các tham số riêng biệt được phân tách bằng dấu và ( & ). Chuỗi truy vấn được dùng để chuyển dữ liệu bổ sung giữa các trang ứng dụng riêng lẻ.

Ví dụ: trang kết quả tìm kiếm được viết bằng PHP có thể sử dụng URL như http://example.com/results.php?item=shirt&season=summer . Trong ví dụ này, hai tham số bổ sung được chuyển đến tập lệnh ứng dụng result.php tưởng tượng: item , với value shirtseason với value summer . Ứng dụng có thể sử dụng thông tin chuỗi truy vấn để xây dựng trang phù hợp cho khách truy cập.

Các luật viết lại của Apache thường được sử dụng để đơn giản hóa các liên kết dài và khó chịu như ví dụ trên thành các URL thân thiện , dễ nhập và diễn giải trực quan hơn. Trong ví dụ này, ta muốn đơn giản hóa liên kết trên để trở thành http://example.com/shirt/summer . Giá trị tham số shirtsummer vẫn có trong địa chỉ, nhưng không có chuỗi truy vấn và tên tập lệnh.

Đây là một luật để thực hiện điều này:

Phân vùng đơn giản
RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer [QSA] 

shirt/summer được đối sánh rõ ràng trong địa chỉ được yêu cầu và Apache được yêu cầu phân phát results.php?item=shirt&season=summer .

Cờ [QSA] thường được sử dụng trong các luật viết lại. Họ yêu cầu Apache nối bất kỳ chuỗi truy vấn bổ sung nào vào URL được phục vụ, vì vậy nếu khách truy cập nhập http://example.com/shirt/summer? page=2 server sẽ trả lời với results.php?item=shirt&season=summer &page=2 . Nếu không có nó, chuỗi truy vấn bổ sung sẽ bị loại bỏ.

Trong khi phương pháp này đạt được hiệu quả mong muốn, cả tên mục và phần đều được mã hóa cứng vào luật . Điều này nghĩa là luật sẽ không áp dụng cho bất kỳ mặt hàng nào khác, như pants hoặc các mùa, như winter .

Để làm cho luật chung chung hơn, ta có thể sử dụng biểu thức chính quy để khớp các phần của địa chỉ root và sử dụng các phần đó trong một mẫu thay thế. Luật được sửa đổi sau đó sẽ giống như sau:

Phân vùng đơn giản
RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA] 

Group biểu thức chính quy đầu tiên trong dấu ngoặc đơn trùng với một chuỗi có chứa các ký tự chữ và số như shirt hoặc pants và lưu phân đoạn đã so khớp dưới dạng biến $1 . Group biểu thức chính quy thứ hai trong dấu ngoặc đơn đối sánh chính xác summer , winter , fall hoặc spring và tương tự lưu phân đoạn đã so khớp dưới dạng $2 .

Sau đó, các phân đoạn phù hợp được sử dụng trong URL kết quả trong các biến itemseason thay vì giá trị shirtsummer mà ta đã sử dụng trước đây.

Ở trên sẽ chuyển đổi, ví dụ: http://example.com/pants/summer thành http://example.com/results.php?item=pants&season=summer . Ví dụ này cũng là bằng chứng trong tương lai, cho phép nhiều mục và phần được viết lại chính xác bằng một luật duy nhất.

Ví dụ 2 - Thêm điều kiện với logic bằng RewriteConds

Các luật viết lại không nhất thiết phải luôn được đánh giá từng cái một mà không có bất kỳ giới hạn nào. Chỉ thị RewriteCond cho phép ta thêm điều kiện vào các luật viết lại của ta để kiểm soát thời điểm các luật sẽ được xử lý. Tất cả các RewriteConds tuân theo định dạng sau:

Cấu trúc RewriteCond chung
RewriteCond TestString Condition [Flags] 
  • RewriteCond chỉ định chỉ thị RewriteCond .
  • TestString là chuỗi để kiểm tra.
  • Condition là mẫu hoặc điều kiện để phù hợp.
  • Flags là các tham số tùy chọn có thể sửa đổi điều kiện và luật đánh giá.

Nếu RewriteCond đánh giá là true, thì RewriteRule tiếp theo sẽ được xem xét. Nếu không, luật sẽ bị loại bỏ. Nhiều RewriteConds được dùng lần lượt, mặc dù tất cả đều phải đánh giá là true để luật tiếp theo được xem xét.

Ví dụ: giả sử bạn muốn chuyển hướng tất cả các yêu cầu đến các file hoặc folder không tồn tại trên trang web trở lại trang chủ thay vì hiển thị trang lỗi 404 Not Found tiêu chuẩn. Điều này có thể đạt được với các luật điều kiện sau:

Chuyển hướng tất cả các yêu cầu đến các file và folder không tồn tại đến trang chủ
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . / 

Với những điều trên:

  • %{REQUEST_FILENAME} là chuỗi cần kiểm tra. Trong trường hợp này, đó là tên file được yêu cầu, là một biến hệ thống có sẵn cho mọi yêu cầu.
  • -f là một điều kiện tích hợp để xác minh xem tên được yêu cầu có tồn tại trên đĩa và là một file hay không. Cái ! là một toán tử phủ định. Kết hợp !-f chỉ có giá trị true nếu tên được chỉ định không tồn tại hoặc không phải là một file .
  • Tương tự !-d đánh giá là true nếu tên được chỉ định không tồn tại hoặc không phải là một folder .

Luật RewriteRule trên dòng cuối cùng sẽ chỉ có hiệu lực đối với các yêu cầu đối với các file hoặc folder không tồn tại. Bản thân RewriteRule rất đơn giản và chuyển hướng mọi yêu cầu đến folder root / trang web.

Kết luận

mod_rewrite cho phép bạn tạo các URL mà con người có thể đọc được. Trong hướng dẫn này, bạn đã học cách sử dụng lệnh RewriteRule để chuyển hướng URL, bao gồm cả những URL có chuỗi truy vấn. Bạn cũng đã học cách chuyển hướng URL có điều kiện bằng chỉ thị RewriteCond .

Nếu bạn muốn tìm hiểu thêm về mod_rewrite , hãy xem Giới thiệu về mod_rewrite của Apachetài liệu chính thức của Apache về mod_rewrite .


Tags:

Các tin liên quan

Cách tạo chứng chỉ SSL tự ký cho Apache trong Debian 10
2019-07-22
Cách cài đặt web server Apache trên Debian 10
2019-07-19
Cách cấu hình Apache HTTP với Sự kiện MPM và PHP-FPM trên FreeBSD 12.0
2019-07-12
Cách cài đặt một Apache, MySQL và PHP (FAMP) trên FreeBSD 12.0
2019-06-28
Cách cài đặt web server Apache trên CentOS 7
2019-05-29
Cách bảo mật Apache bằng Let's Encrypt trên CentOS 7
2019-05-23
Cách cài đặt Apache Kafka trên Ubuntu 18.04
2019-05-10
Cách cài đặt Apache Kafka trên Debian 9
2019-05-10
Cách backup, nhập và di chuyển dữ liệu Apache Kafka của bạn trên Debian 9
2019-03-28
Cách cài đặt Apache Kafka trên CentOS 7
2019-03-27