使用.htaccess为一些文件类型设置Web服务器句柄404错误(ErrorDocument 404 +重写规则)

时间:2014-01-17 08:18:52

标签: wordpress apache .htaccess mod-rewrite http-status-code-404

这是我在这个伟大社区的第一个问题(请告诉我,如果我做错了什么)。我在过去的5 - 6年里从你的答案中学到了很多东西,现在我有一个非常具体的问题,我在互联网上找不到(这有可能吗?)......

目标是设置自定义ErrorDocument 404,它处理不存在的选择的静态文件,如: /notfound.jpg ,并在子目录中(对于任何目录):< em> /dir/notfound.jpg ,对于在Wordpress下运行且启用了非常永久链接的站点。当某些选定的静态文件丢失或链接不正确时,它将避免服务器上的高负载!

我在.htaccess文件中使用了W3 Total缓存插件中略微修改过的代码:

ErrorDocument 404 /_code_404.html

# BEGIN (modified) W3TC Skip 404 error handling by WordPress for static files
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !(robots\.txt|sitemap\.xml(\.gz)?)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} \.(css|js|bmp|gif|ico|jpg|jpeg|jpe|png|swf)$ [NC]
RewriteRule .* - [L]
</IfModule>
# END (modified) W3TC Skip 404 error handling by WordPress for static files

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

我在2个不同的服务器上使用Cpanel进行尝试,在共享计划上,两者都有Wordpress和非常固定的,结果是相同的:

  1. http://mydomain.com/notfound.jpg

  2. 等请求一样正常工作
  3. 对于 http://mydomain.com/dir/notfound.jpg 这样的子目录中的找不到文件不起作用。在这种情况下,WP处理请求并显示404页面,我想避免某些文件类型,即静态文件,如:css,js,jpg等等......

  4. 欢迎任何答案和评论,谢谢!我可以尝试你可能有的任何建议(甚至未经测试)。

    编辑1:为了让它发挥作用而互相注意(请参阅接受的答案+下面的说明):

    您似乎必须(或依赖于服务器配置)设置自定义错误404页面,否则排除某些所选文件类型的重写将无效,因此WP将处理该请求! (似乎没有多少人注意到这一点,或者它可能与服务器配置有关)

    我意识到,因为我在写这个问题之前就尝试了所提出的解决方案,但是没有“ErrorDocument 404”这一行并且它没有用。

    编辑2:测试和其他说明:

    1. 在测试期间,我使用查询字符串测试了URL:/12345.css?v = 5和/dir4/12345.css?v=3&t=66 [它工作正常,因为REQUEST_URI排除了查询字符串!]

    2. 非常重要的一点是,服务器通常应该为丢失的文件返回HTTP代码404(否则搜索引擎会损害您的排名)。如果您在以下位置设置完整域名:ErrorDocument 404 http://mydomain.com/_code_404.html,则“客户端将不会收到原始错误状态代码,而是将收到重定向状态代码”。 (参考 - httpd.apache.org/docs/2.0/mod/core.html#errordocument)

1 个答案:

答案 0 :(得分:4)

你可以试试这个:

ErrorDocument 404 /_code_404.html

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{REQUEST_URI} !(robots\.txt|sitemap\.xml(\.gz)?)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} \.(css|js|bmp|gif|ico|jpe?g|jpe|png|swf)$ [NC]
RewriteRule .* - [L]

RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

</IfModule>