使用nginx返回自定义403错误页面

时间:2010-06-25 15:09:05

标签: webserver nginx http-status-code-403 custom-error-pages

每当发生403错误时,我都试图在/temp/www/error403.html中显示错误页面。

这应该是每当用户尝试通过https(ssl)访问该站点并且它的IP位于blovkips.conf文件中时,但此时它仍然显示nginx的默认错误页面。 我的其他服务器有相同的代码(没有任何阻塞),它可以工作。

是否阻止IP访问自定义403页面? 如果是这样,我如何让它工作?

server  {
    # ssl
    listen               443;
    ssl                  on;
    ssl_certificate      /etc/nginx/ssl/site.in.crt;
    ssl_certificate_key  /etc/nginx/ssl/site.in.key;
    keepalive_timeout    70;

    server_name localhost;


    location / {
            root   /temp/www;
            index  index.html index.htm;
}

# redirect server error pages to the static page
error_page   403  /error403.html;
# location = /error403.html {
#         root   /temp/www;
# }

    # add trailing slash if missing
    if (-f $document_root/$host$uri) {
            rewrite ^(.*[^/])$ $1/ permanent;
    }      

    # list of IPs to block
    include blockips.conf;
}

修改: 修正了错误页面代码从504到403,但我仍有相同的问题

4 个答案:

答案 0 :(得分:4)

在来到这里之前我做了一大堆谷歌搜索,但刚刚做了一些,在5分钟内得到了答案:P

似乎我不是唯一有这个问题的人:

http://www.cyberciti.biz/faq/unix-linux-nginx-custom-error-403-page-configuration/

似乎我认为对我的错误页面的访问被阻止是正确的。

答案 1 :(得分:2)

问题可能在于您尝试从禁止访问的网络服务器中提供403“禁止”错误。 Nginx将error_page指令视为内部重定向。所以它正在尝试服务器https://example.com/error403.html,这也是禁止的。

因此,您需要将错误页面设置为不使用https:

error_page  403   http://example.com/error403.html

或将必要的“允许访问”选项添加到错误页面路径的位置。测试方法是直接访问/error403.html页面。如果您无法以这种方式访问​​,那么当有人收到实际的403错误时,它就无法运行。

答案 2 :(得分:0)

在列出的配置中看起来有一个boo-boo,因为它只向自定义页面发送错误代码503(“service unavailable”),所以对于403(“禁止”)你可能想要使用:< / p>

error_page 403 /error403.html

答案 3 :(得分:0)

我遇到了同样的问题......重点是我已经在服务器上下文级别(或者你喜欢的vhost级别)实现了ip白名单,所以每个位置都会有这个(basicaly /403.html)无法访问):

server {
  listen       *:443 ssl;
  server_name  mydomain.com ;
  error_page 403 /403.html;
  .....
  if ($exclusion = 0) { return 403; } #implemented in another conf.d files (see below)
  location ~ \.php$ {
    root          /var/www/vhosts/mydomain.com/httpdocs;
    include       /etc/nginx/fastcgi_par
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_connect_timeout 3m;
    fastcgi_read_timeout 3m;
    fastcgi_send_timeout 3m;
  }
  location /403.html {
    root      /usr/share/nginx/html;
    allow all;
  }

  ...
}

排除conf.d文件示例:

geo $exclusion {
  default 0;
  10.0.0.0/8  Local network
  80.23.120.23 Some_ip
  ...
}

要解决此问题,只需在位置级别(上下文)返回403:

server {
  listen       *:443 ssl;
  server_name  mydomain.com ;
  error_page 403 /403.html;
  .....
  location ~ \.php$ {
    if ($exclusion = 0) { return 403; } 
    root          /var/www/vhosts/mydomain.com/httpdocs;
    include       /etc/nginx/fastcgi_par
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_connect_timeout 3m;
    fastcgi_read_timeout 3m;
    fastcgi_send_timeout 3m;
  }
  location /403.html {
    root      /usr/share/nginx/html;
    allow all;
  }

  ...
}

适合我。