如何在Ubuntu 14.04上配置Apache以使用自定义错误页面

介绍

Apache是世界上最受欢迎的Web服务器。它功能强大,功能丰富且灵活。在设计网页时,有助于自定义那些客户将看的所有内容,当然这些内容也包括他们请求不可用内容时的错误页面。在本指南中,我们将演示如何配置Apache从而在Ubuntu 14.04上使用自定义错误页面。

先决条件

要开始使用本指南,您需要具有sudo权限的非root用户。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器。您还需要在系统上安装Apache。

创建自定义错误页面

为了达到演示的目的,我们将创建一些自定义错误页面,但您的自定义页面显然会有所不同。

我们将自定义错误页面放在/var/www/html目录中,也就是Ubuntu的Apache安装为其设置的默认文档根。我们将为404错误调用一个名为custom_404.html的页面,同时也为500级错误调用一个名为custom_50x.html的页面。如果您只是测试,则可以使用以下行。否则,将您自己的内容放在以下位置:

echo "<h1 style='color:red'>Error 404: Not found :-(</h1>" | sudo tee /var/www/html/custom_404.html
echo "<p>I have no idea where that file is, sorry.  Are you sure you typed in the correct URL?</p>" | sudo tee -a /var/www/html/custom_404.html
echo "<h1>Oops! Something went wrong...</h1>" | sudo tee /var/www/html/custom_50x.html
echo "<p>We seem to be having some technical difficulties. Hang tight.</p>" | sudo tee -a /var/www/html/custom_50x.html

我们现在有两个自定义错误页面,这两个页面可以在客户端请求导致不同错误的时侯提供。

配置Apache以使用错误页面

现在,我们只需要告诉Apache,当出现正确的错误条件,就应该使用这些页面。在你想要配置的目录/etc/apache2/sites-enabled中打开虚拟主机文件。我们将使用默认的服务器块文件000-default.conf,但如果您使用的是非默认文件,则应调整自己的服务器块:

sudo nano /etc/apache2/sites-enabled/000-default.conf

我们现在可以将Apache指向我们的自定义错误页面。

将错误导向正确的自定义页面

我们可以使用ErrorDocument指令将每种类型的错误与关联的错误页面相关联。这可以在当前定义的虚拟主机中设置。基本上,我们只需将每个错误的http状态代码映射到该错误发生时出现的页面即可。

再我们的示例中,错误映射将如下所示:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
​
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
​
    ErrorDocument 404 /custom_404.html
    ErrorDocument 500 /custom_50x.html
    ErrorDocument 502 /custom_50x.html
    ErrorDocument 503 /custom_50x.html
    ErrorDocument 504 /custom_50x.html
</VirtualHost>

此项更改就足以在指定错误发生时为其提供自定义错误页面。

然而,我们还将添加一组额外的配置,这样的话,客户端无法直接请求我们的错误页面。这可以防止当http状态为“200”(表示请求成功)时,仍然出现一些奇怪的现象比如页面文本引用错误。

用404响应直接请求错误页面

要实现此行为,我们需要为每个自定义页面添加一个Files块。在里面,我们可以测试是否设置了环境变量REDIRECT_STATUS。我们只应在ErrorDocument指令处理请求时设置此项。如果环境变量为空,我们将发出404错误:

<VirtualHost *:80>
​
    . . .
​
    ErrorDocument 404 /custom_404.html
    ErrorDocument 500 /custom_50x.html
    ErrorDocument 502 /custom_50x.html
    ErrorDocument 503 /custom_50x.html
    ErrorDocument 504 /custom_50x.html
​
    <Files "custom_404.html">
        <If "-z %{ENV:REDIRECT_STATUS}">
            RedirectMatch 404 ^/custom_404.html$
        </If>
    </Files>
​
    <Files "custom_50x.html">
        <If "-z %{ENV:REDIRECT_STATUS}">
            RedirectMatch 404 ^/custom_50x.html$
        </If>
    </Files>
</VirtualHost>

当客户端直接请求错误页面时,404错误将会发生,因为未设置正确的环境变量。

设置500级错误的测试

我们可以通过请求不存在的内容轻松生成404错误来测试我们的配置。要测试500级错误,我们必须设置一个虚拟代理传递,以便我们可以确保返回正确的页面。

ProxyPass指令添加到虚拟主机的底部。在本地计算机上为/proxytest发送请求到端口9000(该端口没有运行服务):

<VirtualHost *:80>
​
    . . .
​
    ErrorDocument 404 /custom_404.html
    ErrorDocument 500 /custom_50x.html
    ErrorDocument 502 /custom_50x.html
    ErrorDocument 503 /custom_50x.html
    ErrorDocument 504 /custom_50x.html
​
    <Files "custom_404.html">
        <If "-z %{ENV:REDIRECT_STATUS}">
            RedirectMatch 404 ^/custom_404.html$
        </If>
    </Files>
​
    <Files "custom_50x.html">
        <If "-z %{ENV:REDIRECT_STATUS}">
            RedirectMatch 404 ^/custom_50x.html$
        </If>
    </Files>
​
    ProxyPass /proxytest "http://localhost:9000"
</VirtualHost>

完成后保存并关闭文件。

现在,键入以下命令启用mod_proxymod_proxy_http模块:

sudo a2enmod proxy
sudo a2enmod proxy_http

重新启动Apache并测试您的页面

键入以下命令测试配置文件中的语法错误:

sudo apache2ctl configtest

解决报告中出现的任何问题。当您的文件不包含语法错误时,请键入以下命令重启Apache:

sudo service apache2 restart

现在,当您转到服务器的域或IP地址并请求不存在的文件时,您应该看到我们设置的404页面:

http://server_domain_or_IP/thiswillerror

当您转到我们为虚拟代理通行证设置的位置时,将在我们的自定义500级页面上收到“503 service unavailable”错误:

http://server_domain_or_IP/proxytest

您现在可以返回并从Apache配置中删除伪代理传递行。如果您不需要在其他地方使用代理模块,则可以禁用它们:

sudo a2dismod proxy
sudo a2dismod proxy_http

再次重新启动服务器以实现这些更改:

sudo service apache2 restart

结论

您现在应该为您的网站提供自定义错误页面。即使当年的客户遇到问题,这也是一种简化用户体验个性化的方法。给这些页面的一个建议是,在其中加入可以指引他们获取帮助或更多信息的位置链接。如果你打算采取这个建议,请确保即使在发生相关错误的情况下,该链接也是可以被访问的。

更多Ubuntu 教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Configure Apache to Use Custom Error Pages on Ubuntu 14.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏信安之路

轻松理解 X-XSS-Protection

首先我们来理解一下什么是“X-XSS-Protection”,从字面意思上看,就是浏览器内置的一种 XSS 防范措施。

1420
来自专栏JetpropelledSnake

Python Web学习笔记之Python多线程和多进程、协程入门

进程和线程究竟是什么?如何使用进程和线程?什么场景下需要使用进程和线程?协程又是什么?协程和线程的关系和区别有哪些? 程序切换-CPU时间的分配 首先,我们的任...

3845
来自专栏不止思考

缓存服务的更新策略有哪些?

一般在项目中,最消耗性能的地方就是后端服务的数据库了。而数据库的读写频率常常都是不均匀分布的,大多情况是读多写少,并且读操作(select)还会有一些复杂的判断...

1842
来自专栏不想当开发的产品不是好测试

jenkins 邮件添加附件

背景 当CI执行失败的时候,想获取到失败的用例,然后在本地调试,testNG是自带一个testng-failed.xml来记录的; 想法:尝试使用git 来p...

2515
来自专栏IT笔记

分享一款JVM线程堆栈在线分析工具

JVM大家可能都知道是个什么玩意-Java虚拟机,但是到底是个什么鬼?相信即使工作3-5年的程序员可能也不大了解。 ? 如题所述,今天与大家分享的是如何分析...

2.5K5
来自专栏生信技能树

github极简指南

入生信的坑已经3年多了,但开始github的旅程才一年多,起初主要是为了建立bioconductor中文社区而学习的,现在也在自己的github上面分享了不少代...

3824
来自专栏数据和云

运维经验:回滚段异常的特殊救急方法

? 冷菠 冷菠,资深DBA,著有《Oracle高性能自动化运维》,有近10年的数据库运维、团队管理以及培训经验。擅长数据库备份恢复、数据库性能诊断优化以及数据...

4289
来自专栏程序猿DD

使用Consul做服务发现的若干姿势

来源:http://blog.bossma.cn/consul/consul-service-register-and-discovery-style/?hms...

6754
来自专栏卡少编程之旅

手机adb命令学习

3848
来自专栏北京马哥教育

10个方法助你轻松完成Linux系统恢复

在Linux中有一些应用程序可以帮助你保存系统快照。大多数应用程序都是针对于新手的,并不需要高级的Linux操作技巧。我们在这里挑选了10个,你可以从中选择适合...

5185

扫码关注云+社区

领取腾讯云代金券