跳转到主要内容
祈福的熊猫 提交于 24 September 2012

原文地址:http://drupal.org/node/56773

在高访问量或多人编辑的 Drupal 站点,经常会出现页面上某些文件丢失的情况。比如一个图片文件被重命名,或是僵尸垃圾邮件在网站上扫描特定的CGI漏动等等。

默认Drupal 对.htaccess中定义的所有实例进行404处理,代码是:

# Customized error messages.
ErrorDocument 404 /index.php

Drupal(以及其他基于PHP的CMS)基本都会这样做,使用index.php处理所有URI请求,从而产生正确的页面。

问题在于使用Drupal默认的404处理时,Drupal会努力寻找并尝试调用所有所需要的文件,即便是该文件已经不存在,这在无形中增加了服务器的压力。

现在我们将下面的代码添加到.htaccess中,告诉Apache处理某些文件类型的错误,从而避免上述问题:

# 这将覆盖Drupal的404设置中,不应该被处理的文件设置
<FilesMatch "\.(gif|jpe?g|png|s?html|css|js|cgi)$">
  ErrorDocument 404 default
</FilesMatch>

我们还需要在下面这一行之前:

RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

添加这样一行:

RewriteCond %{REQUEST_FILENAME} !\.(gif|jpe?g|s?html|css|js|cgi)$

这样就可以避免遇到下列类型文件不存在时,Drupal还会去尝试引用该文件的问题。

类型包括:GIF, JPEG, SHTML及HTML, CSS, JS, CGI

以上做法,可以避免Drupal的引导会努力寻找不存在的文件的问题,从而最大限度的降低了数据库的负荷,有助于提高网站的性能。

 

-- 警告 --

这种做法会导致一个已知的问题:如果用这种方法过滤了PNG图像,会影响到system.module中的system_test() 函数。由于该函数会使用一个不存在的png文件调用/system/test目录。

如果禁用的Drupal对PNG文件的默认设置,会导致你无法配置网站的简洁网址(Clean URL)。 —— 本行译文不确定,请参见原文(If you block Drupal's 404 handling for .png files and do not allow this exception, you lose the ability to configure the site for clean_urls.)