Cách Yêu Cầu Apache Không Ghi Lại Một Số Yêu Cầu Nhất Định Trong Nhật Ký Truy Cập Của Nó

theanh

Administrator
Nhân viên
Thông thường, Apache ghi lại tất cả các yêu cầu trong nhật ký truy cập của nó. Trong một số trường hợp, điều này có thể làm sai lệch số liệu thống kê lượt xem trang của bạn (nếu bạn sử dụng một công cụ như Webalizer hoặc AWStats tạo số liệu thống kê dựa trên nhật ký truy cập của Apache), ví dụ nếu bạn nhận được nhiều lượt truy cập từ các công cụ tìm kiếm hoặc từ một địa chỉ IP nhất định (ví dụ: của riêng bạn), hoặc nếu mỗi trang của bạn bao gồm một trang khác (ví dụ: trong iframe) từ trang web của bạn (điều đó sẽ ngay lập tức tăng gấp đôi lượt xem trang của bạn, điều này rõ ràng là không đúng). Hướng dẫn ngắn này cho thấy cách bạn sử dụng chỉ thị SetEnvIf của Apache để ngăn Apache ghi lại các yêu cầu như vậy.

1 Sử dụng SetEnvIf​

Chỉ thị SetEnvIf có thể được sử dụng trong các ngữ cảnh sau trong cấu hình Apache của bạn: trong cấu hình Apache toàn cục (nếu chỉ thị phải hợp lệ cho toàn bộ máy chủ), trong cấu hình vhost (nếu chỉ thị chỉ hợp lệ cho vhost cụ thể đó), giữa <Directory ...></Directory> (nếu chỉ thị chỉ hợp lệ đối với một thư mục nhất định và các thư mục con của nó) và trong các tệp .htaccess (phải đặt AllowOverride FileInfo).

Với SetEnvIf, bạn có thể ngăn các yêu cầu được ghi nhật ký dựa trên các tiêu chí sau (trong số những tiêu chí khác - hãy xem https://httpd.apache.org/docs/current/mod/mod_setenvif.html để biết thêm chi tiết):
  • Host
  • User-Agent
  • Referer
  • Accept-Language
  • Remote_Host: tên máy chủ (nếu có) của máy khách thực hiện yêu cầu.
  • Remote_Addr: địa chỉ IP của máy khách thực hiện yêu cầu.
  • Server_Addr: địa chỉ IP của máy chủ mà yêu cầu được nhận (chỉ với các phiên bản sau 2.0.43).
  • Request_Method: tên của phương thức đang được sử dụng (GET, POST, v.v.).
  • Request_Protocol: tên và phiên bản của giao thức mà yêu cầu được thực hiện (ví dụ: "HTTP/0.9", "HTTP/1.1", v.v.).
  • Request_URI: tài nguyên được yêu cầu trên dòng yêu cầu HTTP - thường là phần URL theo sau phần lược đồ và phần máy chủ không có chuỗi truy vấn.
Phần SetEnvIf có dạng sau:
Mã:
SetEnvIf attribute regex env-variable
trong đó attribute là một trong những tiêu chí tôi vừa đề cập và regex là biểu thức chính quy tương thích với Perl.

Bây giờ hãy giả sử Monit đang yêu cầu tệp /monit/token một lần một phút để kiểm tra xem Apache có còn chạy không. Rõ ràng là chúng ta không muốn ghi lại những yêu cầu này vì chúng không đến từ người dùng thực. Do đó, chúng tôi sử dụng chỉ thị SetEnvIf sau:
Mã:
SetEnvIf Request_URI "^/monit/token$" dontlog
^ có nghĩa là Request_URI phải bắt đầu bằng /monit/token, $ có nghĩa là nó cũng phải kết thúc bằng /monit/token (do đó chỉ có /monit/token khớp với biểu thức chính quy này). Nếu chúng tôi sử dụng "^/monit/token", bất kỳ URL nào bắt đầu bằng /monit/token sẽ khớp với biểu thức chính quy, ví dụ: /monit/token/example.html; "/monit/token$" sẽ khớp với bất kỳ URL nào có đuôi là /monit/token, ví dụ: /example/monit/token.

Bây giờ chúng ta có một iframe trong /iframe/iframe.html mà chúng ta cũng không muốn ghi nhật ký. Đây là những gì chúng ta sẽ sử dụng:
Mã:
SetEnvIf Request_URI "^/iframe/iframe.html$" dontlog
Bây giờ chúng ta phải cho Apache biết rằng nó không được ghi nhật ký tất cả các yêu cầu được gắn nhãn bằng dontlog. Tìm chỉ thị CustomLog trong cấu hình Apache của bạn, ví dụ:
Mã:
CustomLog /var/log/apache2/access.log kết hợp
hoặc
Mã:
CustomLog "|/usr/bin/cronolog --symlink=/var/log/httpd/access.log /var/log/httpd/access.log_%Y_%m_%d" kết hợp
và thêm env=!dontlog vào dòng:
Mã:
CustomLog /var/log/apache2/access.log combined env=!dontlog
hoặc
Mã:
CustomLog "|/usr/bin/cronolog --symlink=/var/log/httpd/access.log /var/log/httpd/access.log_%Y_%m_%d" combined env=!dontlog
Sau đó, khởi động lại Apache. Bây giờ nó sẽ không ghi lại bất kỳ yêu cầu nào được gắn nhãn dontlog nữa.

Sau đây là một số ví dụ khác mà tôi tìm thấy trên các trang này:
Để ngăn chặn tất cả các yêu cầu được thực hiện bằng một trình duyệt nhất định, ví dụ: Internet Explorer, để không bị ghi nhật ký, bạn có thể sử dụng:
Mã:
SetEnvIf User_Agent "(MSIE)" dontlog
Để không ghi nhật ký các yêu cầu từ bất kỳ máy khách nào có tên máy chủ kết thúc bằng bla.example.com, hãy sử dụng:
Mã:
SetEnvIf Remote_Host "bla.example.com$" dontlog
Để không ghi nhật ký các yêu cầu từ bất kỳ máy khách nào có tên máy chủ bắt đầu bằng example, hãy sử dụng:
Mã:
SetEnvIf Remote_Host "^example" dontlog
Để không ghi nhật ký các yêu cầu từ một địa chỉ IP nhất định, hãy sử dụng một cái gì đó như sau:
Mã:
SetEnvIf Remote_Addr "192\.168\.0\.154" dontlog
Nếu bạn không muốn các yêu cầu của robots.txt của mình bị ghi nhật ký, hãy sử dụng:
Mã:
SetEnvIf Request_URI "^/robots\.txt$" dontlog
Ngoài SetEnvIf, phân biệt chữ hoa chữ thường, bạn có thể sử dụng SetEnvIfNoCase không phân biệt chữ hoa chữ thường.

Ví dụ, để không ghi lại một số trình thu thập dữ liệu của công cụ tìm kiếm, bạn có thể sử dụng:
Mã:
SetEnvIFNoCase User-Agent "Slurp/cat" dontlog
SetEnvIFNoCase User-Agent "Ask Jeeves/Teoma" dontlog
SetEnvIFNoCase User-Agent "Googlebot" dontlog
SetEnvIFNoCase Remote_Host "fastsearch.net$" dontlog
Hoặc để không ghi lại một số phần mở rộng tệp nhất định, hãy sử dụng lệnh sau:
Mã:
SetEnvIfNoCase Request_URI "\.(gif)|(jpg)|(png)|(css)|(js)|(ico)|(eot)$" dontlog
Để không ghi lại một số lượt giới thiệu nhất định (ví dụ: từ tên miền của riêng bạn), hãy sử dụng lệnh sau:
Mã:
SetEnvIfNoCase Referer "www\.mydomain\.com" dontlog

2 Liên kết​

 
Back
Bên trên