You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache .htaccess配置错误致PHP日志重复写入问题求助

解决WAMP下AllowOverride All导致PHP脚本重复执行、错误日志重复写入的问题

可能触发问题的原因

  • 浏览器自动请求favicon.ico:现代浏览器会默认请求站点根目录的favicon.ico,如果你的.htaccess规则将所有非文件/目录的请求转发到MVC入口脚本,这个请求会被当成路由请求,触发第二次脚本执行。
  • HTTP/HTTPS跳转叠加触发:如果虚拟主机配置和.htaccess同时设置了HTTPS强制跳转,可能导致一次请求被重复处理。
  • .htaccess重写规则存在循环:规则逻辑漏洞导致请求被多次重定向到入口脚本。

针对性解决方案

1. 过滤favicon.ico请求

在.htaccess中添加排除规则,避免图标请求触发入口脚本:

RewriteEngine On

# 排除favicon.ico的重定向处理
RewriteCond %{REQUEST_URI} !=/favicon.ico

# 仅当请求不是真实文件或目录时,转发到入口脚本
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]

同时可以在站点根目录放置一个空的favicon.ico文件,彻底消除浏览器的404请求触发脚本的可能。

2. 统一SSL跳转配置,避免重复请求

将HTTPS强制跳转逻辑放在httpd-vhosts.conf的虚拟主机配置中,不要在.htaccess中重复设置:

<VirtualHost *:80>
    ServerName mydomain.local
    # 直接将HTTP请求永久跳转到HTTPS
    Redirect permanent / https://mydomain.local/
</VirtualHost>

<VirtualHost *:443>
    ServerName mydomain.local
    # SSL证书配置
    SSLEngine on
    SSLCertificateFile "C:/wamp64/ssl/cert.crt"
    SSLCertificateKeyFile "C:/wamp64/ssl/key.key"

    DocumentRoot "C:/wamp64/www/your-project-root"
    <Directory "C:/wamp64/www/your-project-root">
        AllowOverride All
        Require local
    </Directory>
</VirtualHost>

这样浏览器只会收到一次跳转指令,不会触发两次脚本执行。

3. 给错误日志添加去重逻辑

如果你的自定义错误处理函数没有去重逻辑,两次脚本执行会重复写入相同错误。可以添加静态标记避免重复:

<?php
function customErrorHandler($errno, $errstr, $errfile, $errline) {
    // 用静态数组记录已写入的错误,避免重复
    static $loggedErrors = [];
    $errorSignature = "$errno|$errstr|$errfile|$errline";
    
    if (in_array($errorSignature, $loggedErrors)) {
        return;
    }
    $loggedErrors[] = $errorSignature;

    $logContent = date('Y-m-d H:i:s') . " - Error: [$errno] $errstr in $errfile on line $errline\n";
    file_put_contents('logFile.txt', $logContent, FILE_APPEND);
}

set_error_handler("customErrorHandler");

// 测试错误
trigger_error("Test error message");
?>

4. 验证重复请求来源

在入口脚本顶部添加请求日志,确认是哪个请求触发了二次执行:

<?php
$requestLog = date('Y-m-d H:i:s') . " - Requested URI: " . $_SERVER['REQUEST_URI'] . "\n";
file_put_contents('requestTrace.txt', $requestLog, FILE_APPEND);

// 后续业务逻辑
?>

查看requestTrace.txt就能明确是favicon.ico还是其他请求导致的重复执行。

内容的提问来源于stack exchange,提问作者Miguel Almeida

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:52:19