奇怪的文件请求和使用 .htaccess 缓解服务器压力

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您的旅程的每个阶段提供云产品。立即开始使用 200 美元的免费积分!

我收到了来自 Media Temple(为 CSS-Tricks 提供托管服务的提供商)的电子邮件,告知我本月的“GPU”使用量将超过限制。什么?原来 GPU 是“网格性能单元”,是 Media Temple 用于计算服务器资源使用量的专用方法。我认为除了数据库之外的所有内容都包含在内。他们在他们的界面中提供了一个“GPU 工具”,用于显示哪些网站部分导致了最多的使用量。我想我最好检查一下,确保一切都正常。

此网站的前三个使用量是主页、RSS 订阅和 Atom 订阅。对我来说很有意义……但是列表中的第四个很突出。它是 URL“css-tricks.com/images/ajax-loader.gif”。看看

在这个网站上我并没有真正使用 AJAX,除了少量简单的 jQuery 代码。我最初的想法是投票,因为它过去出现了一些奇怪的问题,并且确实使用了一个小型的旋转器来显示结果。但事实并非如此……文件名不同。奇怪的是,该文件不存在,这就是为什么访问时会抛出 404 错误的原因。

现在,当您在网站上安装了 WordPress(或其他 CMS)时,您可能拥有一个内置于其中的 404 页面,以提供比空白浏览器默认错误页面更友好的体验。看看 我的 404 页面。好吧,它可以更友好一些,但那是另一个故事。关键是,它需要服务器付出比提供一个小型 GIF 图片更多资源才能输出整个页面。我找到一个名为该名称的旋转 GIF 图片,并将其放入我的 images 目录中。

  • 404 页面的总大小:767 KB
  • ajax-loader.gif 的总大小:4 KB

那么这些奇怪的请求来自哪里?我 99% 确信它们是随机的,可能是恶意的,而不是来自该网站的合法请求。我所知道的是,如果我提供图片而不是 404 页面,我可以为每个请求该文件节省 763 KB 的带宽/资源。当每月被点击超过 16,000 次时,这可就积少成多了!

但这并不是唯一被请求该奇怪文件的 URL!各种 URL 都被请求该文件,所有都是 css-tricks.com 的 URL。大多数是不同的随机文章,比如“css-tricks.com/random-post-title/images/ajax-loader.gif”。加起来,这些随机请求比 /images 中的主要请求更加压力大。

我需要一个通用的解决方案来重定向所有这些奇怪的请求,让它们到达正确的位置。幸运的是,Perishable Press 的 Jeff Starr 撰写了一篇关于他遇到的类似问题的及时文章:将对不存在的文件的所有请求重定向到实际文件。他最初遇到的问题是针对对不存在的 favicon.ico 文件的奇怪请求。我也看到了这种现象,还有一些 robots.txt 请求。

是时候停止这一切疯狂,解决这个问题了!

使用一些 .htaccess 魔法,我能够将对该“ajax-loader.gif”文件以及 favicon.ico 文件的任何请求重定向到它们在服务器上的实际位置,并停止抛出浪费带宽的 404 错误。

以下是最终代码

# REDIRECT FAVICON.ICO
<ifmodule mod_rewrite.c>
RewriteCond %{REQUEST_URI} !^/favicon\.ico [NC]
RewriteCond %{REQUEST_URI} favicon\.ico    [NC]
RewriteRule (.*) https://css-tricks.org.cn/favicon.ico [R=301,L]
</ifmodule>

# REDIRECT AJAX-LOADER
<ifmodule mod_rewrite.c>
RewriteCond %{REQUEST_URI} !^/images/ajax\-loader\.gif [NC]
RewriteCond %{REQUEST_URI} ajax\-loader\.gif           [NC]
RewriteRule (.*) https://css-tricks.org.cn/images/ajax-loader.gif [R=301,L]
</ifmodule>

非常感谢 Jeff Starr 在此过程中与我合作,并使其正常工作。您可以通过尝试以以下方式请求文件来查看其效果

https://css-tricks.org.cn/blahblahblah/ajax-loader.gif

您将立即被重定向到正确的位置。

注意:如果您使用的是 WordPress 并且具有特殊的永久链接(像我一样),那么您的根级 .htaccess 文件中已经包含一部分特定于 WordPress 的内容。这些内容需要放在前面才能正常工作。