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.
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):
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:
^ 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:
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ụ:
hoặc
và thêm env=!dontlog vào dòng:
hoặc
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:
Để 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:
Để 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:
Để 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:
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:
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:
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:
Để 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:
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.
Mã:
SetEnvIf attribute regex env-variable
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
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
Mã:
CustomLog /var/log/apache2/access.log kết hợp
Mã:
CustomLog "|/usr/bin/cronolog --symlink=/var/log/httpd/access.log /var/log/httpd/access.log_%Y_%m_%d" kết hợp
Mã:
CustomLog /var/log/apache2/access.log combined env=!dontlog
Mã:
CustomLog "|/usr/bin/cronolog --symlink=/var/log/httpd/access.log /var/log/httpd/access.log_%Y_%m_%d" combined env=!dontlog
Sau đây là một số ví dụ khác mà tôi tìm thấy trên các trang này:
- http://forums.digitalpoint.com/showthread.php?p=488716
- http://www.keithjbrown.co.uk/vworks/unix/logs.php
- http://www.htaccesselite.com/htaccess/setenvif-examples-vt141.html
Mã:
SetEnvIf User_Agent "(MSIE)" dontlog
Mã:
SetEnvIf Remote_Host "bla.example.com$" dontlog
Mã:
SetEnvIf Remote_Host "^example" dontlog
Mã:
SetEnvIf Remote_Addr "192\.168\.0\.154" dontlog
Mã:
SetEnvIf Request_URI "^/robots\.txt$" dontlog
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
Mã:
SetEnvIfNoCase Request_URI "\.(gif)|(jpg)|(png)|(css)|(js)|(ico)|(eot)$" dontlog
Mã:
SetEnvIfNoCase Referer "www\.mydomain\.com" dontlog
2 Liên kết
- Mô-đun Apache mod_setenvif:https://httpd.apache.org/docs/current/mod/mod_setenvif.html