Вернуть пользовательскую страницу ошибки 403 с помощью nginx - PullRequest
8 голосов
/ 25 июня 2010

Я пытаюсь отобразить страницу ошибки в /temp/www/error403.html всякий раз, когда возникает ошибка 403.

Это должно происходить всякий раз, когда пользователь пытается получить доступ к сайту через 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;
}

Edit: Исправлен код ошибки error_page с 504 до 403, но у меня все еще та же проблема

Ответы [ 4 ]

5 голосов
/ 01 июля 2010

До того, как приехать сюда, я много гуглил, но сделал еще кое-что, через 5 минут я получил ответ:

Кажется, я не единственный, у кого есть эта проблема:

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

Кажется, я был прав, полагая, что доступ к моей странице с ошибкой блокировался.

2 голосов
/ 01 июля 2010

Проблема может заключаться в том, что вы пытаетесь отослать ошибку 403 «Запрещено» с веб-сервера, доступ к которому запрещен. Nginx обрабатывает директиву error_page как внутреннее перенаправление. Так что он пытается на сервер https://example.com/error403.html, что также запрещено.

Таким образом, вы должны сделать так, чтобы страница ошибок не обслуживалась из https:

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

или добавьте необходимые параметры «доступ разрешен» в местоположение для пути к странице ошибки. Способ проверить это - получить прямой доступ к странице /error403.html. Если вы не можете получить доступ таким образом, это не сработает, когда кто-то получит фактическую ошибку 403.

0 голосов
/ 22 июля 2016

У меня была та же проблема ... Дело в том, что я реализовал белый список ip на уровне контекста сервера (или на уровне vhost, если вы предпочитаете), так что в каждой локации это тоже будет (basicaly /403.html won ' быть доступным):

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

  ...
}

У меня работает.

0 голосов
/ 30 июня 2010

Похоже, что в указанной конфигурации есть бу-бу, поскольку он только отправляет код ошибки 503 («служба недоступна») на пользовательскую страницу, поэтому для 403 («запрещено») вы, вероятно, захотите использовать:

error_page 403 /error403.html
...