Cách viết lại URL bằng mod_rewrite cho Apache trên Ubuntu 20.04
Mô-đunmod_rewrite của Apache cho phép bạn viết lại URL rõ rà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 các 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 :
Một server Ubuntu 20.04 được cài đặt theo hướng dẫn cài đặt server ban đầu Ubuntu 20.04 , bao gồm user không phải root có quyền sudo và firewall .
Đã cài đặt Apache theo Bước 1 của Cách cài đặt ngăn xếp Linux, Apache, MySQL, PHP (LAMP) trên Ubuntu 20.04 .
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 các file  cấu hình  server  thay vì .htaccess vì Apache xử lý theo cách đó 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 và nó không yêu cầu quyền root để chỉnh sửa các  luật  đó, đơn giản hóa việc bảo trì và  áp dụng các thay đổi  có thể thực hiện được với account  không có  quyền . Một số phần mềm nguồn mở phổ biến, như WordPress và Joomla, thường dựa vào .htaccess để phần mềm sửa đổi và tạo các  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.
<VirtualHost *:80>     <Directory /var/www/html>         Options Indexes FollowSymLinks         AllowOverride All         Require all granted     </Directory>      . . . </VirtualHost> Lưu và đóng file . Để những thay đổi này có hiệu lực, hãy khởi động lại Apache.
- sudo systemctl restart apache2 
 
Bây giờ, tạo một .htaccess trong webroot.
- 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.
RewriteEngine on Lưu file và thoát.
 Bây giờ  ta  có một .htaccess hoạt động mà  ta  có thể sử dụng để điều chỉnh các  luật  định tuyến của ứng dụng web của  ta . Trong bước tiếp theo,  ta  sẽ tạo các 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 , nhưng hiển thị trang có tên about.html .
 Bắt đầu bằng cách tạo một file  có tên about.html trong webroot.
- sudo nano /var/www/html/about.html 
 
Sao chép mã HTML sau vào file , sau đó lưu và đóng nó.
<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:
RewriteRule pattern substitution [flags] RewriteRulechỉ định chỉ thị.-  
patternlà 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. -  
substitutionlà đường dẫn đến URL thực, tức là đường dẫn của server Apache file . -  
flagslà 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 dòng đầu tiên, thêm RewriteRule đánh dấu và lưu file .
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 sauyour_server_ip /. -  
$cho biết phần cuối của URL. -  
abouttrùng với chuỗi “about”. -  
about.htmllà 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 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 thích hợp ban đầu 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ì sauabout, vì ký tự$xuất hiện sauabout. -  
http:// your_server_ip /contact, vì nó sẽ không trùng với chuỗiabouttrong 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 shirt và season 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  ghi lại 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ư ở 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ố shirt và summer vẫn nằm 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:
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ẽ trông như sau:
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 đã 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 item và season thay vì các giá trị shirt và summer 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 một cách chính xác bằng cách sử dụ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  được xử lý. Tất cả các RewriteConds tuân theo định dạng sau:
RewriteCond TestString Condition [Flags] RewriteCondchỉ định chỉ thịRewriteCond.-  
TestStringlà chuỗi để kiểm tra. -  
Conditionlà mẫu hoặc điều kiện để phù hợp. -  
Flagslà 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 ngay sau đó sẽ được xem xét. Nếu không,  luật  sẽ bị loại bỏ. Nhiều RewriteCond  được dùng  lần lượt và với hành vi mặc định, tất cả đều phải đánh giá là true để  luật  sau đượ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:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . / [R=301] 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. -  
-flà 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!-fchỉ có giá trị true nếu một tên cụ thể 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 một tên cụ thể 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. Dấu chấm . trong mô hình phù hợp với bất kỳ thứ gì và sự thay thế hướng mọi yêu cầu đến root  / trang web.
 Ngoài ra, cờ [R=301] yêu cầu Apache trả lại mã phản hồi HTTP chuyển hướng vĩnh viễn 301 cho trình duyệt, dẫn đến trình duyệt biết chuyển hướng đã xảy ra và tìm nạp rõ ràng root  trang web thay vì URL được yêu cầu, với thay đổi được phản ánh trên thanh địa chỉ của trình duyệt.
Nếu không có cờ này, Apache sẽ trả về nội dung root của trang web, nhưng trình duyệt vẫn nghĩ rằng URL trang được yêu cầu tồn tại và sẽ hiển thị địa chỉ được yêu cầu ban đầu trên thanh địa chỉ.
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 đã sử dụng lệnh RewriteRule để chuyển hướng các URL, bao gồm cả những URL có chuỗi truy vấn. Bạn cũng đã viết các URL chuyển hướng 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 Apache và tài liệu chính thức của Apache về mod_rewrite .
Các tin liên quan
Cách viết lại URL bằng mod_rewrite cho Apache trên Ubuntu 18.042020-10-27
Cách bảo mật Apache bằng Let's Encrypt trên Debian 10
2020-10-22
Lỗi cấu hình Apache AH00558: Không thể xác định một cách đáng tin cậy tên miền đủ điều kiện của server
2020-08-06
Lỗi cấu hình Apache AH02572: Không thể cấu hình ít nhất một chứng chỉ và khóa
2020-08-06
Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 18.04
2020-08-06
Lỗi cấu hình Apache AH00526: Lỗi cú pháp
2020-07-30
Cách khắc phục các lỗi Apache thường gặp
2020-07-30
Lỗi mạng Apache AH00072: make_sock: không thể liên kết với địa chỉ
2020-07-30
Cách tạo chứng chỉ SSL tự ký cho Apache trong Ubuntu 20.04
2020-07-06
Cách tạo chứng chỉ SSL tự ký cho Apache trên CentOS 8
2020-06-30

