nginx 自定义404页面

时间:2022-11-07 22:51:05

网上搜了一大堆 还是不成功 其实关键步骤都没有说明白,特意总结一下 希望希望能帮助到有需要的童鞋们。

1.创建自己的404.html页面 (位置是根据root 那个目录定的,先放在网站根目录下,下面在详细说明)

2.更改nginx.conf在http定义区域加入: fastcgi_intercept_errors on;

vim /etc/nginx/nginx.conf 

3.关键步骤
网上说【中在server 区域加入: error_page 404 = /404.html 或者 error_page 404 = http://www.xxx.com/404.html
//如果是二级域名,在相应的vhost/目录下的后缀为conf的文件编辑,如在root /home/www;这行下面添加error_page 404 = /404.html 】

**实践证明 应该是在
location /{
error_page 500 502 503 504 /404.html
}
location 这里放error_page**

我的配置(刚接触nginx,可能有不合理的地方)

vim /etc/nginx/sites-available/localhost

PS好像发现需要在/etc/nginx/sites-enabled/ 目录下创建/etc/nginx/sites-available/目录里的软连接,为什么这样不太懂原理,如下图
nginx 自定义404页面


server{
listen 80;
server_name ~.*;
root /var/www/html;

# index index.html index.jsp;
# error_page 404 = /404.htm;
# error_page 502 = /404.htm;
#放在这里都不生效 始终是默认的404

location ~ .*\.(js|html|mp3|gif|jpg|jpeg|png|bmp|swf|ico|css)$ #设定访问静态文件直接读取不经过tomcat
{
root /var/lib/tomcat7/webapps/ROOT;
access_log off;
expires 30d;
}


location ~ (.jsp)|(.do)(.action)$
{
proxy_set_header Host $host;
error_page 500 502 503 504 /404.html; #error_page放在这个位置才会生效。404页面放在项目根目录
proxy_pass http://127.0.0.1:8080;
}

location ~ .*$
{
proxy_set_header Host $host;
error_page 500 502 503 504 /404.html;
proxy_pass http://127.0.0.1:8080;
}

location *$
{
proxy_set_header Host $host;
error_page 500 502 503 504 /404.html;
proxy_pass http://127.0.0.1:8080;
}

location ^~ /dwr/ #针对dwr的请求走tomcat
{
proxy_set_header Host $host;
error_page 500 502 503 504 /404.html;
proxy_pass http://127.0.0.1:8080;
}


}

注意事项:

1.必须要添加:fastcgi_intercept_errors on; 如果这个选项没有设置,即使创建了404.html和配置了error_page也没有效果。fastcgi_intercept_errors 语法: fastcgi_intercept_errors on|off 默认: fastcgi_intercept_errors off 添加位置: http, server, location 默认情况下,nginx不支持自定义404错误页面,只有这个指令被设置为on,nginx才支持将404错误重定向。这里需要注意的是,并不是说设置了fastcgi_intercept_errors on,nginx就会将404错误重定向。在nginx中404错误重定向生效的前提是设置了fastcgi_intercept_errors on,并且正确的设置了error_page这个选项(包括语法和对应的404页面)

2.不要出于省事或者提高首页权重的目的将首页指定为404错误页面,也不要用其它方法跳转到首页。

3.自定义的404页面必须大于512字节,否则可能会出现IE默认的404页面。例如,假设自定义了404.html,大小只有11个字节(内容为:404错误)。

一个简单的404.html


<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>404</title>
<style type="text/css" media="screen">
body {background-color:#CCE8CF;text-align:center;}
a {font-family:"微软雅黑";color:#16708C;text-decoration:none;}
a:hover {color:#21ADB7;text-decoration:underline;}
</style>
</head>
<body>
<img src="http://3.url.cn/qun/create/img/404.jpg">
<br/>
<a href="/" >O~ NO 404</a>
<script type="text/javascript">
var $img = new Image();
$img.src = 'http://jsreport.qq.com/cgi-bin/report?id=167&rs=0-0-215961&r='+Math.random();
</script>
</body>
</html>

今天下午该配置文件 神奇的事情发生了!error_page放在server里居然能生效!不知道是不是因为重启了机器的缘故!
改进之后的配置如下

 server{
listen 80;
server_name ~.*;

root /var/lib/tomcat7/webapps/ROOT;
# root /var/www/html;
index index.html index.jsp;
#据说这是全局的
error_page 500 502 503 504 404 /404.html;
#location貌似是按顺序匹配的。所以有先后顺序

#正则^~ /dwr/ 匹配dwr开始的请求 项目中dwr请求要经过tomcat所以需要代理
location ^~ /dwr/ #^~ 这个代表符合后不匹配其他的location了
{
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;

}

location ^~ /data/ #tomcat的映射路径 挂载的硬盘里
{ #这样静的似乎拿不到只能交给tomcat去处理了
# root /data/customfiles/photos/;
# expires 30d;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}

location ~ .*\.(jpg|js|html|mp3|gif|jpeg|png|bmp|swf|ico|css)$ #设定访问静态文件直接读取不经过tomcat
{
root /var/lib/tomcat7/webapps/ROOT;
access_log off;
expires 30d;
}

location ~ (.jsp)|(.do)(.action)$
{
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
location ~ .*$
{
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}

location *$
{
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
}

最后再看看效果
两台一模一样的服务器 一台配置了nginx动静分离。静态资源不经过tomcat。
nginx 自定义404页面