我正在编写一个显示 svg 图像的网页。java 脚本应该通过添加标签来加载此 svg 中的许多小缩略图(大约 400 个)<image>
。正如浏览器调试输出所示,并非所有这些缩略图都已加载。许多都失败并出现“错误 403”。
缩略图文件的权限正确。我可以用浏览器单独加载它们。这个问题似乎在多个浏览器中都一致出现。
我怀疑我同时发送了太多文件请求。我可能无法直接访问服务器,但很可能是 Linux 上的 apache2。是否有控制每个客户端最大文件数的参数或硬编码限制(例如,有一个名为的参数MaxKeepAliveRequests
)或是否有任何其他问题可能导致此行为?
有没有办法找到运行服务器的实际计算机的 IP(当然我找到了 URL 转换成的 IP,但据我所知,这台计算机并没有运行实际的服务器。端口可能被转发了)?
尽管这可能与主题无关:是否有推荐的 Java 脚本解决方案来解决加载许多文件时出现的此类问题?
我找到了一些可能相关的 Apache 配置。它似乎加载了mod_evasive
。可能是这个吗?
相关配置是
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 10
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 3
DOSBlockingPeriod 20
DOSEmailNotify ""
DOSLogDir "/var/log/apache2/mod_evasive.log"
</IfModule>
答案1
这听起来像是一种速率限制。有几个 Apache 模块可以做到这一点,mod_qos
这就是其中之一。通常它们除了403 forbidden
返回代码外,还会返回简短的正文,其中包含一些详细信息,例如链接到可接受使用政策或类似内容。看看您的抓取脚本是否能显示除 403 错误代码之外的内容。在 apache 进行限制之前,还可能存在反向代理。
解决方案是,保持对同一站点的并发请求数量较低(如果不是 1)。并遵守robots.txt
!还请记下目标站点服务条款和可接受使用政策。
更新是的,mod_evasive
也会这样做。您可以禁用它(如果您可以控制站点)或调整其参数。具体来说,在您的案例中,如果您DOSSiteCount
在DOSSiteInterval
时间内执行的请求数超过请求数,它将被阻止。因此,您需要增加允许的请求数或限制您的获取速度(通过限制下载并行性和/或在每个请求后插入延迟)
答案2
是的,evasive
可以这样做。要验证这一点,只需在 Apache 的错误日志文件中查找evasive
,您就会得到所需的所有信息。