这是我在这个伟大社区的第一个问题(请告诉我,如果我做错了什么)。我在过去的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和非常固定的,结果是相同的:
对于 http://mydomain.com/dir/notfound.jpg 这样的子目录中的找不到文件不起作用。在这种情况下,WP处理请求并显示404页面,我想避免某些文件类型,即静态文件,如:css,js,jpg等等......
欢迎任何答案和评论,谢谢!我可以尝试你可能有的任何建议(甚至未经测试)。
编辑1:为了让它发挥作用而互相注意(请参阅接受的答案+下面的说明):
您似乎必须(或依赖于服务器配置)设置自定义错误404页面,否则排除某些所选文件类型的重写将无效,因此WP将处理该请求! (似乎没有多少人注意到这一点,或者它可能与服务器配置有关)
我意识到,因为我在写这个问题之前就尝试了所提出的解决方案,但是没有“ErrorDocument 404”这一行并且它没有用。
编辑2:测试和其他说明:
在测试期间,我使用查询字符串测试了URL:/12345.css?v = 5和/dir4/12345.css?v=3&t=66 [它工作正常,因为REQUEST_URI排除了查询字符串!]
非常重要的一点是,服务器通常应该为丢失的文件返回HTTP代码404(否则搜索引擎会损害您的排名)。如果您在以下位置设置完整域名:ErrorDocument 404 http://mydomain.com/_code_404.html,则“客户端将不会收到原始错误状态代码,而是将收到重定向状态代码”。 (参考 - httpd.apache.org/docs/2.0/mod/core.html#errordocument)
答案 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>