Назад | Перейти на главную страницу

Создание резервной страницы ошибки для nginx, когда корневой каталог не существует

Я настроил конфигурацию любого домена на моем сервере nginx - чтобы уменьшить объем работы, необходимой при открытии нового сайта / домена. Эта конфигурация позволяет мне просто создать папку в /usr/share/nginx/sites/ с именем домена / поддомена и тогда он просто работает. ™

server {
    # Catch all domains starting with only "www." and boot them to non "www." domain.
    listen 80;
    server_name ~^www\.(.*)$;
    return 301 $scheme://$1$request_uri;
}

server {
    # Catch all domains that do not start with "www."
    listen 80;
    server_name ~^(?!www\.).+;
    client_max_body_size 20M;

    # Send all requests to the appropriate host
    root /usr/share/nginx/sites/$host;

    index index.html index.htm index.php;
    location / { 
        try_files $uri $uri/ =404;
    }

    recursive_error_pages on;
    error_page 400 /errorpages/error.php?e=400&u=$uri&h=$host&s=$scheme;
    error_page 401 /errorpages/error.php?e=401&u=$uri&h=$host&s=$scheme;
    error_page 403 /errorpages/error.php?e=403&u=$uri&h=$host&s=$scheme;
    error_page 404 /errorpages/error.php?e=404&u=$uri&h=$host&s=$scheme;
    error_page 418 /errorpages/error.php?e=418&u=$uri&h=$host&s=$scheme;
    error_page 500 /errorpages/error.php?e=500&u=$uri&h=$host&s=$scheme;
    error_page 501 /errorpages/error.php?e=501&u=$uri&h=$host&s=$scheme;
    error_page 503 /errorpages/error.php?e=503&u=$uri&h=$host&s=$scheme;
    error_page 504 /errorpages/error.php?e=504&u=$uri&h=$host&s=$scheme;

    location ~ \.(php|html) {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_intercept_errors on;
    }
}

Однако есть одна проблема, которую я хотел бы решить: когда домен, у которого нет папки в каталоге сайтов, nginx выдает внутреннюю страницу ошибки 500, потому что он не может перенаправить на /errorpages/error.php поскольку его не существует.

Как я могу создать резервную страницу ошибок, которая будет перехватывать эти неудавшиеся запросы?

Попробуйте использовать if условный на вашем сервере, который обрабатывает случаи, когда этот веб-сайт не существует

server {
    # Catch all domains that do not start with "www."
    listen 80;
    server_name ~^(?!www\.).+;
    client_max_body_size 20M;

    # Send all requests to the appropriate host

    if(!-d /usr/share/nginx/sites/$host){ 
        set $host notexist
    }

    root /usr/share/nginx/sites/$host;

    index index.html index.htm index.php;
    location / { 
        try_files $uri $uri/ =404;
    ...

И добавьте index.html в /usr/share/nginx/sites/notexist описывая, что сайт не существует

Резервные страницы ошибок в nginx работают так:

error_page 400 /400.html;
location = /400.html {
    try_files /400.html @error;    # <-- this is your missing part 1
    internal;                      # suggested
}
location @error {   # <-- this is your missing part 2
    root /var/www/error;
}

Возможно, мне нужно подумать об этом подробнее, но что, если вы попробуете что-то вроде:

location /errorpages {
try_files $uri $uri/  @fallback
}

location @fallback {
root /usr/share/nginx/sites/default
... error page directives ...

}

Где по умолчанию содержатся страницы ошибок для несуществующих сайтов.

В основном попробуйте создать условный корень.

Видеть: http://end.re/2011/05/02/nginx-alternative-root-with-conditional-autoindex/

Обновить

Это сработало для случая 404:

location / 
try_files $uri $uri/ @errors;
...
}

location @errors {
try_files $uri $uri/ =510;
root /usr/share/nginx/sites/errors;
error_page 404 = /404.html
}

(Конечно, вы должны создать error / 404.html)

Может быть, это сработает: (вместо возврата 404 в последнем месте вы можете попробовать указать точный URL-адрес ошибки)

location / { 
        try_files $uri $uri/ @notfound;
    }

location @notfound {
  root /usr/share/nginx/sites/errorpages;
  return 404;
}

Ниже фрагмент кода должен решить вашу проблему

  http {
      server {
          error_page 404 http://www.mywebsite.com/error.php;
          error_page 500 http://www.mywebsite.com/error.php;

    }
  ................
  ................
    }