簡體   English   中英

使用.htaccess和PHP記錄所有HTTP請求

[英]Logging all HTTP requests using .htaccess and PHP

我需要在我的網站上放置一個php腳本來記錄所有HTTP請求。 access.log沒有足夠的信息來建議我。

我的想法是在/www/上使用.htaccess並使用重寫規則對通過php腳本保存的每個請求傳遞一個日志。 (類似於print_r($_GLOBALS)

你們中有人知道更好的方法嗎?

我知道這是一個老問題。 如您所建議,如果您使用共享主機,則可能僅限於必須通過腳本重定向所有流量。

我不得不做一次。 對於一個遭到黑客攻擊的WordPress網站,我需要確定其受到的攻擊方式。 就像您說的,我將所有帶有.htaccess文件的請求重定向到一個PHP腳本,該腳本將呈現一個簡單的“站點正在維護”頁面,但該請求也將記錄該請求-帖子數據,Cookie,上傳文件名-我想觀察的任何東西。

方便的是,該站點也處於Cloudflare的保護之下。 因此,通過這樣做,Cloudflare最終在維護頁面上看到503 Unavailable(不可用),而轉為緩存,從而使站點幾乎完全啟動。 更好的是,維護頁面仍然能夠記錄請求。


我的.htaccess文件顯示如下:

RewriteEngine On
RewriteRule ^index-maintenance\.php$ - [L]
RewriteRule .* /index-maintenance.php [L]

然后, index-maintenance.php文件如下所示:

<?php
    $record = TRUE; // whether or not to record requests

    header('HTTP/1.1 503 Service Unavailable', TRUE, 503);
    header('Retry-After: 18000');

    if($record) {
        // Get remote IP
        // If the site uses cloudflare, the true remote IP is served
        // in the HTTP_CF_CONNECTING_IP server var:
        $ip = isset($_SERVER['HTTP_CF_CONNECTING_IP'])
            ? $_SERVER['HTTP_CF_CONNECTING_IP']
            : $_SERVER['REMOTE_ADDR'];

        ob_start();

        // Request date / IP / URL
        echo date('Y-m-d H:i:s: ')
            . 'Remote IP: ' . $ip
            . ' - ' . $_SERVER['REQUEST_METHOD']
            . ' ' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']
            . "\r\n";

        // User agent
        echo $_SERVER['HTTP_USER_AGENT'] . "\r\n";

        // If you needed all headers:
        # foreach(getallheaders() as $header => $value)
        #   echo "$header: $value\r\n";

        // If you wanted raw request data vs. parsed POST data:
        # $postdata = file_get_contents('php://input');
        # if(strlen($postdata)) echo $postdata."\r\n";

        // Post data / Cookies / Files
        if(count($_POST) || count($_COOKIE)) {
            ob_start();

            echo "POST\n";
            var_dump($_POST);

            echo "COOKIES\n";
            var_dump($_COOKIE);

            echo "FILES\n";
            var_dump($_FILES);

            $postdata = ob_get_clean();
            echo str_replace("\n","\r\n",$postdata);
        }
        echo "\r\n";

        // usage of random character string discourages guessing
        // the url if the directory is web-accessible; but, if at
        // all possible, make it inaccessible:
        file_put_contents('../requests_n5io09d21mkp.log',ob_get_clean(),FILE_APPEND);
    }

    // then, a simple maintenance page:
?>
<!DOCTYPE html>
<html>
    <head>
        <title>Site Under Maintenance</title>
    </head>
    <style type="text/css">
        body {
            margin: 0;
            width: 100vw;
            height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
        }
        .notice {
            color: #808080;
            font: bold 20px/1.6em sans-serif;
            text-align: center;
        }
    </style>
    <body>
        <p class="notice">
            We're sorry. The site is under maintenance.<br/>Please check back later.
        </p>
    </body>
</html>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM