原文地址: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.)