Thứ tư, 26/10/2016 | 00:00 GMT+7

Cách thiết lập mod_rewrite cho Apache trên CentOS 7

Apache là một web server module cho phép bạn tùy chỉnh các khả năng của nó bằng cách bật và tắt các module . Điều này cung cấp cho administrator khả năng điều chỉnh chức năng của Apache để đáp ứng nhu cầu của ứng dụng web của họ.

Trong hướng dẫn này, ta sẽ cài đặt Apache trên server CentOS 7, xác nhận module mod_rewrite được bật và khám phá một số chức năng cần thiết.

Yêu cầu

Trước khi làm theo hướng dẫn này, hãy đảm bảo bạn có một regular user , không phải root có quyền sudo. Bạn có thể tìm hiểu thêm về cách cài đặt user có các quyền này từ hướng dẫn của ta , Cách tạo user Sudo trên CentOS .

Bước 1 - Cài đặt Apache

Ta sẽ cài đặt Apache bằng yum , tiện ích quản lý gói mặc định cho CentOS.

  • sudo yum install httpd

Khi được yêu cầu với thông báo Is this ok [y/d/N]: :, hãy nhập Y và nhấn ENTER để cho phép cài đặt.

Tiếp theo, khởi động daemon Apache, một quy trình độc lập tạo ra một group các quy trình con hoặc stream để xử lý các yêu cầu, với tiện ích systemctl :

  • sudo systemctl start httpd

Để đảm bảo Apache đã khởi động thành công, hãy kiểm tra trạng thái của nó bằng lệnh status :

  • sudo systemctl status httpd
Output
. . . systemd[1]: Starting The Apache HTTP Server... systemd[1]: Started The Apache HTTP Server.

Với Apache được cài đặt và chạy, ta hãy chuyển sự chú ý của ta đến các module của nó.

Bước 2 - Xác minh mod_rewrite

Kể từ version CentOS 7, module mod_rewrite Apache được bật theo mặc định. Ta sẽ xác minh đây là trường hợp bằng lệnh httpd và cờ -M , sẽ in ra danh sách tất cả các module đã tải:

  • httpd -M
Output
. . . remoteip_module (shared) reqtimeout_module (shared) rewrite_module (shared) setenvif_module (shared) slotmem_plain_module (shared) . . .

Nếu rewrite_module không xuất hiện trong kết quả , hãy kích hoạt nó bằng cách chỉnh sửa file 00-base.conf bằng editor vi :

  • sudo vi /etc/httpd/conf.modules.d/00-base.conf

Khi file văn bản mở ra, hãy nhập i để vào chế độ insert và sau đó thêm hoặc bỏ comment được đánh dấu bên dưới:

/etc/httpd/conf.modules.d/00-base.conf
# # This file loads most of the modules included with the Apache HTTP # Server itself. # . . . LoadModule rewrite_module modules/mod_rewrite.so . . . 

Bây giờ nhấn ESC để thoát khỏi chế độ insert . Sau đó, gõ :x rồi nhấn ENTER để lưu và thoát khỏi file .

Tiếp theo, áp dụng thay đổi cấu hình bằng cách khởi động lại Apache:

  • sudo systemctl restart httpd

Với Apache được cài đặt và module mod_rewrite được kích hoạt, ta đã sẵn sàng cấu hình việc sử dụng .htaccess .

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

Tệp .htaccess cho phép xác định các chỉ thị cho Apache, bao gồm RewriteRule , trên cơ sở mỗi domain mà không làm thay đổi file cấu hình server . Trong Linux, các file đứng trước dấu chấm ( . ) Được coi là ẩn.

Trước khi sử dụng .htaccess , ta cần cập nhật cài đặt AllowOverride để có thể overrides các chỉ thị Apache.

  • sudo vi /etc/httpd/conf/httpd.conf

Tìm phần <Directory /var/www/html> và thay đổi chỉ thị AllowOverride từ None thành All :

/etc/httpd/conf/httpd.conf
. . . <Directory /var/www/html> . . .  #   # AllowOverride controls what directives may be placed in .htaccess files.  # It can be "All", "None", or any combination of the keywords:  # Options FileInfo AuthConfig Limit  #  AllowOverride All . . . </Directory> . . . 

Lưu và thoát file rồi khởi động lại Apache để áp dụng thay đổi:

  • sudo systemctl restart httpd

Tiếp theo, tạo .htaccess trong root tài liệu mặc định, /var/www/html , cho Apache.

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

Thêm dòng sau vào đầu file để kích hoạt RewriteEngine , hướng dẫn Apache xử lý bất kỳ luật nào tuân theo:

/var/www/html/.htaccess
RewriteEngine On 

Lưu và thoát khỏi file .

Đến đây bạn có một .htaccess cho phép bạn xác định các luật để thao tác các URL khi cần thiết. Trước khi bắt đầu viết các luật thực tế, hãy dành một chút thời gian để xem lại cú pháp mod_rewrite cơ bản.

Bước 4 - Khám phá cú pháp RewriteRule

Chỉ thị RewriteRule cho phép ta bản đồ lại yêu cầu Apache dựa trên URL. Tệp .htaccess có thể chứa nhiều hơn một luật viết lại, nhưng Apache tại thời điểm chạy sẽ áp dụng các luật theo thứ tự xác định của chúng. Luật viết lại bao gồm cấu trúc sau:

RewriteRule Pattern Substitution [Flags]

  • RewriteRule: chỉ định chỉ thị RewriteRule
  • Mẫu : PCRE (Biểu thức chính quy tương thích Perl) trùng với chuỗi mong muốn. Bạn có thể tìm hiểu thêm về cụm từ thông dụng tại đây .
  • Thay thế : các yêu cầu phù hợp nên được gửi ở đâu
  • [ Cờ ]: tham số tùy chọn để sửa đổi luật . Để biết thêm thông tin về các cờ có sẵn và ý nghĩa của chúng, hãy xem tài liệu của Apache về Viết lại cờ .

RewriteRule là workhorse của các chỉ thị mod_rewrite , đó là lý do tại sao ta chủ yếu tập trung vào nó trong hướng dẫn này.

Bước 5 - Khám phá cú pháp RewriteCond

Chỉ thị RewriteCond cho phép ta thêm các điều kiện vào luật viết lại. Điều kiện viết lại bao gồm cấu trúc sau:

RewriteCond TestString Condition [Flags]

  • RewriteCond: chỉ định chỉ thị RewriteCond
  • TestString : một chuỗi để kiểm tra
  • Điều kiện : một mẫu để phù hợp
  • [ Flags ]: tham số tùy chọn để sửa đổi điều kiện.

Chỉ thị RewriteCond không cho phép Apache xem xét bất kỳ luật viết lại nào tuân theo nó trừ khi điều kiện cụ thể đánh giá là true.

Bước 6 - Cài đặt file

Ta sẽ cài đặt luật viết lại cơ bản để cho phép user truy cập trang about.html mà không cần nhập phần mở rộng file ( .html ) vào thanh địa chỉ của trình duyệt web. Bắt đầu bằng cách tạo file about.html trong folder root của tài liệu:

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

Sao chép mã HTML sau vào file :

/var/www/html/about.html
<!DOCTYPE html> <html>     <head>         <title>About Us</title>     </head>     <body>         <h1>About Us</h1>     </body> </html> 

Lưu và thoát khỏi file .

Trong trình duyệt web, chuyển đến địa chỉ sau:

http://server_domain_or_IP/about.html 

Bạn sẽ thấy một trang trắng có Giới thiệu về ta trên đó. Nếu bạn xóa .html khỏi thanh địa chỉ và reload trang, bạn sẽ nhận được lỗi 404 Không tìm thấy . Apache chỉ có thể truy cập các thành phần bằng tên file đầy đủ của chúng, nhưng ta có thể thay đổi điều đó bằng luật viết lại.

Bước 7 - Cài đặt Luật viết lại

Ta muốn khách truy cập vào trang Giới thiệu để truy cập trang này mà không cần phải nhập .html . Để thực hiện điều này, ta sẽ tạo một luật .

Mở .htaccess :

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

Sau dòng RewriteEngine On , hãy thêm phần sau:

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

Lưu và thoát khỏi file .

Như vậy, khách truy cập có thể truy cập trang Giới thiệu về ta bằng URL http:// server_domain_or_IP /about .

Hãy xem xét luật viết lại:

^about$ đóng role là mẫu được khớp từ URL và những gì user nhập vào trình duyệt của họ.
Ví dụ của ta sử dụng một số siêu ký tự đảm bảo rằng cụm từ chỉ tồn tại ở một vị trí cụ thể trong URL:

  • ^ cho biết phần bắt đầu của URL, sau khi server_domain_or_IP / bị loại bỏ.
  • & nghĩa là phần cuối của URL

about.html hiển thị đường dẫn đến file mà Apache phân phát khi nó gặp một mẫu phù hợp.

[NC] là một cờ hướng dẫn luật viết lại không phân biệt chữ hoa chữ thường để user có thể nhập các chữ cái thường và chữ hoa trong URL. Ví dụ: các URL sau trỏ đến file about.html :

  • miền server or_IP / about
  • miền server or_IP / Giới thiệu
  • miền server hoặc_IP / GIỚI THIỆU

Với luật viết lại đơn giản, ta đã thêm một khía cạnh động vào cách user có thể truy cập trang Giới thiệu .

Các mẫu chung

Bây giờ ta đã hiểu cơ bản về các luật viết lại, ta sẽ khám phá hai ví dụ bổ sung trong phần này.

Các file ví dụ có thể được cài đặt , nhưng hướng dẫn này không bao gồm việc tạo chúng; chỉ là các luật viết lại chính nó.

Ví dụ 1: Đơn giản hóa chuỗi truy vấn với luật viết lại

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 ký tự dấu chấm hỏi ( ? ) Và được phân tách bằng ký tự dấu và ( & ). Apache bỏ qua hai ký tự này 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ụ: URL cho trang kết quả tìm kiếm được viết bằng PHP có thể trông giống như sau:

http://example.com/results.php?item=shoes&type=women 

Thay vào đó, ta muốn khách truy cập có thể sử dụng URL rõ ràng hơn sau:

http://example.com/shoes/women 

Ta có thể đạt được những kết quả này bằng một trong hai cách - thông qua các tùy chọn thay thế hoặc đối sánh đơn giản.

Ví dụ 1A: Thay thế Đơn giản

Ta sẽ tạo luật ghi lại để thực hiện thay thế đơn giản, đơn giản hóa một URL truy vấn dài:

/var/www/html/.htaccess
RewriteRule ^shoes/women$ results.php?item=shoes&type=women 

Luật ánh xạ shoes/women với results.php?item=shoes&type=women .

Ví dụ 1B: Tùy chọn Kết hợp

Trong một số trường hợp, ta có thể cần tổng quát hóa chuỗi truy vấn để bao gồm các loại giày khác nhau. Ta có thể thực hiện điều này bằng cách làm như sau:

  • Chỉ định một loạt các tùy chọn bằng cách sử dụng ống đứng | , toán tử Boolean “OR”
  • Group trận đấu bằng cách sử dụng () , sau đó tham chiếu group bằng cách sử dụng biến $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 ^shoes/(men|women|youth) results.php?item=shoes&type=$1 

Luật hiển thị ở trên trùng với URL của shoes/ theo sau là một loại được chỉ định. Điều này sẽ sửa đổi URL ban đầu để:

http://example.com/shoes/men 

trở thành:

http://example.com/results.php?item=shoes&type=men 

Tùy chọn đối sánh này cho phép Apache đánh giá một số mẫu mà không cần phải tạo luật viết lại riêng cho từng mẫu.

Ví dụ 1C: Đối sánh các bộ ký tự

Tuy nhiên, ta cũng xin nêu rõ bất kỳ mặt hàng nào, không giới hạn chỉ /shoes . 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]+)/(men|women|youth) results.php?item=$1&type=$2 

Ví dụ trên sẽ chuyển đổi:

http://example.com/pants/men 

đến:

http://example.com/results.php?item=pants&type=men 

Ta đã mở rộng thành công khả năng đối sánh để bao gồm nhiều khía cạnh của một URL.

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/men nhưng sẽ chuyển một chuỗi truy vấn bổ sung ?page=2 . Ta muốn ánh xạ URL sau:

http://example.com/pants/men?page=2 

đến:

http://example.com/results.php?item=pants&type=men&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, làm cho các chuỗi truy vấn được kết hợp. Sửa đổi luật viết lại để phù hợp với luật sau sẽ đạt được hành vi mong muốn.

/var/www/html.html
RewriteRule ^([A-Za-z0-9]+)/(men|women|youth) results.php?item=$1&type=$2 [QSA] 

Ví dụ 2: Thêm điều kiện với Logic

Bây giờ ta sẽ xem xét việc sử dụng chỉ thị RewriteCond . Nếu một điều kiện viết lại trả về true, sau đó Apache coi RewriteRule mà sau nó.

Ví dụ 2A: Trang mặc định

Trước đây, ta đã thấy Apache xử lý yêu cầu URL không hợp lệ bằng cách phân phối trang 404 Not Found . Tuy nhiên, thay vì một trang lỗi, ta muốn tất cả các URL không đúng định dạng được chuyển hướng trở lại trang chủ. 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/.htacces
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^admin/(.*)$ /admin/home 

Điều này sẽ chuyển hướng thông tin như /admin/ random_text đến /admin/home .

Hãy cùng mổ xẻ luật trên:

  • %{REQUEST_FILENAME} kiểm tra chuỗi được yêu cầu
  • !-f ! hoặc không toán tử tuyên bố rằng nếu tên file được yêu cầu không tồn tại, thì hãy thực hiện luật ghi lại sau.
  • RewriteRule chuyển hướng các yêu cầu trở lại /admin/home

Việc xác định ErrorDocument 404 sẽ tuân theo các phương pháp hay nhất. Để làm điều đó, ta sẽ tạo luật ErrorDocument để trỏ các lỗi 404 vào trang error.html :

/var/www/html/.htaccess
ErrorDocument 404 /error.html 

Điều này chuyển hướng bất kỳ yêu cầu nào dẫn đến phản hồi HTTP 404 đến trang error.html .

Ví dụ 2B: Hạn chế địa chỉ IP

RewriteCond được dùng để cho phép truy cập vào một trang web bằng một địa chỉ IP cụ thể.

Ví dụ này chặn lưu lượng truy cập từ mọi nơi ngoại trừ 198.51.100.24.

/var/www/html/.htaccess
RewriteCond %{REMOTE_ADDR} !^(198\.51\.100\.24)$ RewriteRule (.*) - [F,L] 

Toàn bộ luật nói rằng nếu địa chỉ IP yêu cầu tài nguyên không phải là 198.51.100.24, thì không cho phép truy cập.

Nói ngắn gọn:

  • %{REMOTE_ADDR} là chuỗi địa chỉ
  • !^(198\.51\.100\.24)$ phủ định địa chỉ IP. \ Dấu gạch chéo ngược thoát khỏi . dấu chấm, bởi vì nếu không, chúng đóng role là siêu ký tự được sử dụng để trùng với bất kỳ ký tự nào.
  • 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 quyền truy cập từ địa chỉ cụ thể, hãy sử dụng cách sau:

/var/www/html/.htaccess
RewriteCond %{REMOTE_ADDR} ^(198\.51\.100\.24)$ RewriteRule (.*) - [F,L] 

Mặc dù bạn có thể sử dụng các phương pháp khác để chặn hoặc cho phép lưu lượng truy cập vào trang web của bạn , nhưng việc cài đặt giới hạn trong .htaccess là cách dễ nhất để đạt được những kết quả này.

Kết luận

Trong hướng dẫn này, ta đã sử dụng .htaccess để làm việc với các lệnh RewriteRuleRewriteCond . Có nhiều lý do để sử dụng các luật viết lại và các tài nguyên sau nêu chi tiết các khả năng của module mod_rewrite :

Mô-đun mod_rewrite là một thành phần quan trọng của web server Apache và bạn có thể làm được nhiều điều với nó. Tuy nhiên, không phải lúc nào mọi thứ cũng diễn ra theo đúng kế hoạch và khi điều đó xảy ra, bạn có thể thấy mình mắc phải vòng lặp chuyển hướng hoặc lỗi 500 forbidden mơ hồ. Để biết các mẹo gỡ lỗi các loại tình huống này, hãy xem lại bài đăng StackOverflow này .


Tags:

Các tin liên quan

Cách di chuyển web root Apache đến vị trí mới trên Ubuntu 16.04
2016-07-27
Cách thiết lập xác thực mật khẩu với Apache trên Ubuntu 16.04
2016-07-26
Cách cung cấp các ứng dụng Django với Apache và mod_wsgi trên Ubuntu 16.04
2016-05-17
Cách mã hóa kết nối Tomcat 8 với Apache hoặc Nginx trên Ubuntu 16.04
2016-04-29
Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 16.04
2016-04-21
Cách thiết lập server ảo Apache trên Ubuntu 16.04
2016-04-21
Cách tạo chứng chỉ SSL tự ký cho Apache trong Ubuntu 16.04
2016-04-21
Cách thiết lập Let's Encrypt chứng chỉ cho nhiều server ảo Apache trên Ubuntu 14.04
2016-01-19
Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 14.04
2015-12-18
Cách thiết lập server lưu lượng truy cập Apache làm Reverse-Proxy trên Ubuntu 14.04
2015-10-03