如何创建自定义的401、403和500错误页面?


27

遇到404错误时,可以使用404.php模板文件来呈现自定义错误消息。模板层次结构文章中对此进行了记录。

我的目的是为401、403和500错误创建自定义错误页面。我曾尝试在主题目录中创建401.php,403.php和500.php文件,但这不起作用。

如何在WordPress中创建自定义的401、403和500错误页面?


2
您可以尝试使用以下代码作为起点:jesin.tk/wordpress-custom-403-401-error-page
Joe

这是一个现有的插件,可让您自定义错误页面,例如403和401错误:http : //wordpress.org/plugins/custom-error-pages/您只需要做的就是安装并激活。但是,您必须手动编辑在插件选项页面中指定的.htaccess(或nginx.conf)文件。
皮恋人

Answers:


15

错误页面通过.HTACCESS提供服务,如果您使用的是Apache,则可以使用该ErrorDocument指令并将状态和URL添加到该指令中。

因此,它在您的.htaccess文件中看起来像这样:

ErrorDocument 401 http://yourwebsite.com/error-401
ErrorDocument 403 http://yourwebsite.com/error-403
ErrorDocument 500 http://yourwebsite.com/error-500

您可以在下面使用以下功能。这将为您动态添加到HTACCESS文件所需的内容,或者您​​可以手动执行。

1.添加页面:

然后,您需要进入仪表板,然后像创建任何普通页面一样创建页面(“仪表板”>“页面”>“新建”)。它们可以按照您希望的名称命名,只需确保该段与下面的函数相同(段:error-401,error-403,error-404,error-500)。您也可以使用页面模板为这些特定页面创建所需的任何布局和样式。请按照WordPress Codex说明进行操作。

2.添加功能:

// Create Custom Error Pages in WordPress using HTACCESS
function royal_custom_error_pages() {

    // Get HTACCESS path & dynamic website url
    $htaccess_file = '.htaccess';
    $website_url = get_bloginfo('url').'/';

    // Check & prevent writing error pages more than once
    $check_file = file_get_contents($htaccess_file);
    $this_string = '# BEGIN WordPress Error Pages';

    if( strpos( $check_file, $this_string ) === false) {

    // Setup Error page locations dynamically
    $error_pages .= PHP_EOL. PHP_EOL . '# BEGIN WordPress Error Pages'. PHP_EOL. PHP_EOL;
    $error_pages .= 'ErrorDocument 401 '.$website_url.'error-401'.PHP_EOL;
    $error_pages .= 'ErrorDocument 403 '.$website_url.'error-403'.PHP_EOL;
    $error_pages .= 'ErrorDocument 404 '.$website_url.'error-404'.PHP_EOL;
    $error_pages .= 'ErrorDocument 500 '.$website_url.'error-500'.PHP_EOL;
    $error_pages .= PHP_EOL. '# END WordPress Error Pages'. PHP_EOL;

    // Write the error page locations to HTACCESS
    $htaccess = fopen( $htaccess_file, 'a+');
    fwrite( $htaccess, $error_pages );
    fclose($htaccess);

    }
}

add_action('init','royal_custom_error_pages'); // This will run the function everytime, not ideal!

// register_activation_hook( __FILE__, 'royal_custom_error_pages' ); // Using a plugin, runs only once!

注意!上面的功能说明

在移动网站或更改URL结构时

上面的函数要记住的一点是,尽管在将它们写入HTACCESS文件之前会检查ErrorDocument指令是否已经存在,但是如果您更改或移动博客以反映更新的页面位置,它将不会重写ErrorDocument指令。您需要首先删除HTACCESS文件中现有的ErrorDocument指令,然后重新运行此函数以创建新的指令。

纠正挂钩仅触发一次功能

要注意的另一件事是此功能,使用该init操作将在每次页面加载时运行,这是超级不必要和浪费的,所以我建议将其添加到插件中,并使用register_activation_hook相当,这样在激活插件时仅触发一次

文件权限

同样,当您使用上述功能时,.htaccess也必须是可写的,因此请确保它具有正确的文件权限,例如CHMOD777。


不知道这应该如何工作,是否手动编辑了.htaccess文件,但这不起作用。我正在尝试在localhost上执行此操作,这应该在localhost上可行,因为我可以访问所有内容,服务器和客户端。但是为什么这不起作用?
所罗门·克洛森

@SolomonClosson,也许您可​​以尝试使用我为此编写的插件,它会为您做所有事情,并完全按照上面的代码进行:)。官方WordPress.Org插件
马特皇家

@MattRoyal该功能很好用,我正在使用它来创建其他htaccess规则。如何使规则插入文件的最上方,请高于默认的wp htaccess规则?目前,规则已添加到htaccess文件的底部。谢谢。
lowtechsun

我不同意该解决方案:1-您不应在网络服务器上使用任何777功能!通常,这只是一种不好的做法,并且会导致重大的安全漏洞。2-您正在向网站的每个请求添加文件写操作,这是一种写操作,它将在文件上创建一个锁,在您减少请求数量并同时响应时,仅允许一次写操作。3-网站不应该依赖其运行服务器,如果将其迁移到使用nginx的系统,它将按预期停止运行。...继续
爱德华多·奥利维拉

4-有更干净的方法来解决错误stackoverflow.com/a/34619308/768516
Eduardo Oliveira
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.