Một đồng nghiệp gần đây đã nhận xét rằng trong khi bài đăng cuối cùng của tôi đưa ra lời giải thích hợp lệ làm thế nào một 408 có thể có mối liên hệ với một biện pháp bảo mật, nó không đưa ra giải pháp.
Nhật ký truy cập Piped là giải pháp cá nhân của tôi.
Những điều sau đây sẽ hoạt động vượt trội trên hầu hết các cấu hình Ubuntu và với sự sửa đổi tối thiểu trên các cấu hình Apache khác. Tôi đã chọn PHP vì nó dễ hiểu nhất. Có hai tập lệnh: lần đầu tiên ngăn chặn 408 được ghi vào nhật ký truy cập của bạn. Kịch bản thứ hai gửi tất cả 408 đến một tệp nhật ký riêng. Dù bằng cách nào thì kết quả không còn 408s trong nhật ký truy cập của bạn. Đó là sự lựa chọn của bạn để thực hiện kịch bản.
Sử dụng trình soạn thảo văn bản yêu thích của bạn, tôi sử dụng nano. Mở tệp nơi bạn có các lệnh 'LogFormat' và 'CustomLog'. Nhận xét bản gốc với # thông thường và thêm phần sau. Bạn có thể tìm thấy các chỉ thị trong tập tin dưới đây.
sudo nano / etc / apache2 / site-Available / default
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" AccessLogPipe
CustomLog "|/var/log/apache2/PipedAccessLog.php" AccessLogPipe env=!dontlog
LƯU Ý: Tôi không đăng nhập hình ảnh trong nhật ký truy cập của mình. Trong tập tin etc / apache2 / httpd.conf của tôi, tôi bao gồm dòng
SetEnvIfNoCase Request_URI ".(gif)|(jpg)|(png)|(css)|(js)|(ico)$" dontlog
Nếu điều này không được bạn quan tâm thì hãy loại bỏ env=!dontlog
khỏi CustomLog
chỉ thị.
Bây giờ hãy tạo một trong các tập lệnh PHP sau ( #!/usr/bin/php
là tham chiếu đến vị trí của trình thông dịch, hãy đảm bảo rằng vị trí đó là chính xác cho hệ thống của bạn - bạn có thể làm điều này bằng cách nhập vào dấu nhắc $; whereis php
- điều này sẽ trả về một cái gì đó như php: /usr/bin/php /usr/bin/X11/php /usr/share/man/man1/php.1.gz
. có thể thấy #!/usr/bin/php
là đúng cho thiết lập của tôi).
sudo nano /var/log/apache2/PipedAccessLog.php
#!/usr/bin/php
<?php
$file = '/var/log/apache2/access.log';
$no408 = '"-" 408 0 "-" "-"';
$stdin = fopen ('php://stdin', 'r');
ob_implicit_flush (true);
while ($line = fgets ($stdin)) {
if($line != "") {
if(stristr($line,$no408,true) == "") {
file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
}
}
}
?>
sudo nano /var/log/apache2/PipedAccessLog.php
#!/usr/bin/php
<?php
$file = '/var/log/apache2/access.log';
$file408 = '/var/log/apache2/408.log';
$no408 = '"-" 408 0 "-" "-"';
$stdin = fopen ('php://stdin', 'r');
ob_implicit_flush (true);
while ($line = fgets ($stdin)) {
if($line != "") {
if(stristr($line,$no408,true) != "") {
file_put_contents($file408, $line, FILE_APPEND | LOCK_EX);
}
else {
file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
}
}
}
?>
Đã lưu PipedAccessLog.php
tập lệnh; đảm bảo rằng root có quyền sở hữu bằng cách thực hiện như sau tại dấu nhắc $.
sudo chown -R root:adm /var/log/apache2/PipedAccessLog.php
Các PipedAccessLog.php
kịch bản sẽ cần đọc / ghi và thực hiện quyền để thực hiện những điều sau đây tại $ nhắc.
sudo chmod 755 /var/log/apache2/PipedAccessLog.php
Cuối cùng, để mọi thứ hoạt động, bạn cần khởi động lại dịch vụ Apache. Thực hiện như sau tại dấu nhắc $.
sudo service apache2 restart
Nếu nhật ký Apache của bạn được đặt ở nơi khác thì hãy thay đổi đường dẫn cho phù hợp với cấu hình của bạn. Chúc may mắn.