简体   繁体   English

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

[英]Return custom 403 error page with nginx

Im trying to display the error page in /temp/www/error403.html whenever a 403 error occurs. 我试图在发生403错误时在/temp/www/error403.html中显示错误页面。

This should be whenever a user tries to access the site via https (ssl) and it's IP is in the blovkips.conf file, but at the moment it still shows nginx's default error page. 这应该是每当用户尝试通过https(ssl)访问该站点并且它的IP位于blovkips.conf文件中时,但此时它仍然显示nginx的默认错误页面。 I have the same code for my other server (without any blocking) and it works. 我有其他服务器相同的代码(没有任何阻止),它的工作原理。

Is it blocking the IP from accessing the custom 403 page? 是否阻止IP访问自定义403页面? If so how do I get it to work? 如果是这样,我如何让它工作?

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;
}

Edit: Corrected error_page code from 504 to 403 but I still have the same issue 编辑:更正了错误页面代码从504到403,但我仍然有同样的问题

I did heaps of googling before coming here but did some more just now, within 5 minutes I had my answer :P 在来到这里之前我做了大量的谷歌搜索,但刚刚做了一些,在5分钟内我得到了答案:P

Seems I'm not the only person to have this issue: 似乎我不是唯一有这个问题的人:

error_page 403 /e403.html;
  location = /e403.html {
  root   html;
  allow all;
}

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

Seems that I was right in thinking that access to my error page was getting blocked. 似乎我认为对我的错误页面的访问被阻止是正确的。

The problem might be that you're trying to server a 403 "Forbidden" error from a webserver that they are forbidden from accessing. 问题可能是您尝试从禁止访问的网络服务器中提供403“禁止”错误。 Nginx treats the error_page directive as an internal redirect. Nginx将error_page指令视为内部重定向。 So it is trying to server https://example.com/error403.html which is also forbidden. 因此它正在尝试服务器https://example.com/error403.html ,这也是禁止的。

So you need to make the error page not served out of https like this: 因此,您需要使错误页面不是由https提供的,如下所示:

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

or add the necessary "access allowed" options to the location for the error page path. 或者将必要的“允许访问”选项添加到错误页面路径的位置。 The way to test this is to access the /error403.html page directly. 测试方法是直接访问/error403.html页面。 If you can't accesses that way, it isn't going to work when someone gets an actual 403 error. 如果您无法以这种方式访问​​,则当有人收到实际的403错误时,它将无法工作。

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

error_page 403 /error403.html

I had the same issue... The point is that i've implemented ip whitelist at server context level (or vhost level if you prefer), so every locations will have this as well (basicaly /403.html won't be accessible) : 我有同样的问题......重点是我已经在服务器上下文级别(或者你喜欢的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;
  }

  ...
}

Exclusion conf.d file sample: 排除conf.d文件示例:

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

To fix that simply do your return 403 at location level (context): 要修复它,只需在位置级别(上下文)返回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;
  }

  ...
}

Works for me. 适合我。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM