如何跳过wordpress的404处理并将静态文件的所有404错误重定向到404.html?

我阅读了,在使用永久链接时似乎不可能?

目标通过不加载php来减少404错误的服务器负载。

#1 楼

.htaccess跳过对静态文件的WordPress 404错误处理。
<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_URI} !(robots\.txt|sitemap\.xml(\.gz)?)
        RewriteCond %{REQUEST_FILENAME} \.(css|js|html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$ [NC]
        RewriteRule .* - [L]
    </IfModule>

注:这些规则是由W3 Total Cache插件生成的。
Nginx跳过对静态文件的WordPress 404处理。
if (-f $request_filename) {
    break;
}
if (-d $request_filename) {
    break;
}
if ($request_uri ~ "(robots\.txt|sitemap\.xml(\.gz)?)") {
    break;
}
if ($request_uri ~* \.(css|js|html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$) {
    return 404;
}


评论


真好!使用以下命令从日志中查找更多404文件扩展名:sed -rn'/“ 404 /s/^.*\.([[a-z]+)HTTP。* $ / \ 1 / igp'log / access_log | sort | uniq

– Quinn Comendant
20 May 17'0:19

#2 楼

继续Chris_O所说的...。我将安装W3 Total Cache并使用该插件中的设置不缓存静态文件。插件本身非常有用,并且是加快网站速度的必不可少的工具,尤其是使用最新更新时。

我也建议您看看通过Wordpress创建错误404页面,以了解如何处理404静态文件,403(禁止)等内容。这是一本好书。

#3 楼

也许是一个简单的解决方案。使用条件标签is_404()并创建到您的静态文件的重定向;在主题的文件header.phpindex.php中添加代码。

这里是一个示例。

   if ( is_404() ) {
      wp_redirect( 'static.htm' );
      exit;
   }


链接


http://codex.wordpress.org/Function_Reference/wp_redirect
http://codex.wordpress.org/Function_Reference/is_404


评论


决策仍然是在PHP中完成的,而不是在htaccess级别上。目的是完全跳过PHP的加载,以免出现404错误。

–freethinker
2011年8月2日,下午5:19

@freethinker:对,只能通过php;通过htaccess的方式更快,但在WordPress中可能不太容易处理

– Bueltge
2011年8月2日在19:41

@kaiser oops,更新了问题

–freethinker
2011年8月2日在23:44

#4 楼

我不确定这是否可能。如果您查看WordPress启用永久链接时创建的htaccess代码,它的基本含义是:“如果找不到文件/目录,请将其发送到index.php。”这包括所有实际的404请求。除了创建WordPress知道的每个动态生成的公共资源的列表并将其直接插入.htaccess之外,您还需要加载php来处理404。

#5 楼

我喜欢Chris_O的想法,但是我制作了自己的版本,所以更安全。

所以,我所做的只是将文件夹添加到异常中,因此,如果您的请求是从这些行开始的-这肯定是不是有效的永久链接。大多数请求来自试图检查这些文件夹内容以进行攻击的漫游器。它们将被有效过滤,并且如果需要,您可以显示一些小的静态404页面。

其他请求仍将由wordpress处理,并且如果有人输入了错误的地址,它将显示未找到用户友好您模板中的消息。 Chris_O的解决方案仅适用于看起来像文件扩展名的请求,否则它们也将由wordpress处理。

要使其更加可靠,您可以检索原始访问文件并搜索404。错误。如果您发现许多以特定行开头的请求,也可以将它们包括在此过滤器中:

#adding your own handler
ErrorDocument 404 /404/index.html

<IfModule mod_rewrite.c>
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_URI} !^/(404|cgi-bin|wp-admin|wp-content|wp-includes)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>


#6 楼

我的网站上安装了多个CMS,因此我使用类似的方法对所有CMS使用相同的404错误页面。我将此配置文件用于Nginx + FastCgi,并且运行良好:

server {
    ...
    error_page 404 /404.html; #enable custom 404 error page
    location ~ /\.ht {
        deny all; #disable access to htaccess
    }
    location ~ [^/]\.php(/|$) {
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_intercept_errors on; #disable PHP 404 error intercept
    }
    location /wordpress/ {
        try_files $uri $uri/ /wordpress/index.php?$args;
    }
}


我在php.ini中将此配置与此一起使用:
cgi.fix_pathinfo = 1 


WordPress的安装方法如下:http://example.com/wordpress/。 404.html位于http://example.com/的根目录中。

P.S.不要忘记对php.ini或nginx.conf文件进行更改后,需要重新启动PHP和Nginx服务,以使更改生效。

#7 楼

共有3种方法


通过更改404.php代码。
通过使用wordpress插件。
通过编辑.htaccess文件。

完整的教程-(链接已失效并重定向到垃圾邮件)

评论


嗨,Mazhar,您能否发布完整答案,而不仅仅是发布指向您网站的链接。如果该链接消失,该答案将几乎毫无用处!干杯!

–斯蒂芬·哈里斯(Stephen Harris)
2012年9月27日上午9:35

此页面给出404。具有讽刺意味的。还是您想说些什么?

– Michiel van der Blonk
2015年9月16日在2:49