0

我不是 100% 确定这个问题属于这里还是属于 ServerFault,但我会将它发布到社区希望我发布的地方。我有一个每天处理数千个重定向的网站。我们的许多客户抱怨他们正在失去一些流量。在仔细检查代码后,我们推断当我们重定向时流量实际上正在丢失:

header("Location: https://samedomain/differentpath/");
exit;

100% 的流量到达调用这行代码的页面。只有大约 60% 的访问访问了https://samedomain/differentpath

起初我们认为这是服务器问题,所以我们尝试了多种不同的 apache 和 mpm_prefork 设置组合,但均无济于事。这是我们当前的 mpm prefork 配置:

<IfModule mpm_prefork_module>
        StartServers                     5
        MinSpareServers           5
        MaxSpareServers          10
        MaxRequestWorkers         1786
        MaxConnectionsPerChild   0
</IfModule>

在进行了一些基准测试并发送了大量流量后,我注意到当我直接从自己的 IP 发送流量时,会发生 100% 的重定向。这很棒!我可能弄错了,但至少我可以更有信心服务器可以处理它(我已经在大约 2-3 分钟内测试了 2k 次访问)。然后我稍微修改了我的测试来模拟真实流量,所以我得到了一个随机代理列表,这更像是我的真实流量,我再次失去了 40% 的流量。而这一切都随着标题而丢失了。在此标头出现之前,我 100% 确信没有其他任何内容被发送到响应中。我们不提供内容,我们只重定向。

为了确保在标头出现之前我没有遇到响应内容问题,我开始使用元标记、JavaScript 重定向和标头刷新进行重定向,结果相同。

作为最后的绝望尝试,我们使用 php FastCGI 启动了 Nginx 服务器。发现同样的问题我并不感到惊讶。

顺便说一句,服务器资源也没有意义,因为我在发送大量流量的同时查看了进程,它在 12% 的 CPU 和 4% 的 RAM 时达到峰值。以下是服务器的一些详细信息:

Ubuntu 18.04.3 (LTS) x64 6 个 vCPU 16GB /320GB 磁盘

我应该提一下,我们的数据库服务器与此服务器是分开的,并且具有相同的规格。我们还启动了几台服务器并添加了一个负载均衡器,我们得到了(惊喜)相同的结果。

所以我的问题是,知道标头重定向没有因为内容而失败(我的一些测试我只有重定向但它仍然失败),还有其他可能的原因导致这种情况发生吗?这可能是 apache 问题,还是 php 问题,或两者兼而有之?

PS:我还查看了所有错误日志,它们很干净。

编辑:我认为有问题的其他问题是流量来源。也许代理被我的提供商阻止了,但如果是这种情况,最初的访问也不会点击页面,对吗?只是我认为可能有用的另一点信息。

4

1 回答 1

0

提供 301 重定向是对访问您网站的客户的指示。您不能强迫该访客实际去那里。所以你永远不会得到 100% 的重定向率。话虽如此,大多数人类Web 客户端(也称为 Web 浏览器)的标准行为是遵循该指令并转到您的标头响应中提供的目的地。您最有可能遇到的是标准机器人流量。大多数机器人,无论好坏,在面临重定向时都有很大不同的行为。有时他们会跟随,而更多时候他们不会。您看到大约 40% 的人没有关注,这与 Internet 上当前 bot 流量的估计值(估计范围为 40-60%)完全吻合。

您可能需要分析日志中的 IP 地址和用户代理,以确定它们是否来自已知机器人并查看它们的百分比。您还可以尝试使用有助于确定流量并将其记录下来进行测试的软件包。例如:https ://github.com/JayBizzle/Crawler-Detect只需了解没有任何检测程序会 100% 准确。

如果您担心人类访问者没有被正确重定向,您可以将内容添加到包含您的重定向代码的页面,并提供一个按钮或链接,以帮助他们到达您尝试重定向到的页面。

于 2019-09-26T17:57:49.057 回答