Подтвердить что ты не робот

Как заставить nginx всегда возвращать пользовательский 404 для хоста по умолчанию

У меня есть nginx 0.8.53 с некоторыми виртуальными хостами, которые работают так, как я хочу. Однако из-за наилучшего соответствия nginx на виртуальных хостах я должен добавить хост по умолчанию, чтобы поймать все запросы, которые не относятся к конкретному виртуальному хосту. Я хотел бы, чтобы хост по умолчанию возвращал страницу 404, которая не указала, что я запускаю nginx 0.8.53.

Я предполагал, что это должно быть что-то вроде:

# The default server.
#
server {
    listen       80 default_server;
    server_name  everythingelse;

    # Everything is a 404
    location / {
        return 404;
    }
    error_page 404 /opt/local/html/404.html;
}

Но это все еще возвращает страницу nginx 404 по умолчанию, которая имеет номер версии. Кажется, что "return 404" игнорирует конфигурацию "error_page".

4b9b3361

Ответ 1

Вот что я имею в своем conf, чтобы заставить его работать:

# The default server.
server {
  listen       80 default_server;
  server_name  everythingelse;

  error_page 404 /404.html;

  # Everything is a 404
  location / {
    return 404; #return the code 404
  }

  # link the code to the file
  location = /404.html {
    #EDIT this line to make it match the folder where there is your errors page
    #Dont forget to create 404.html in this folder
    root  /var/www/nginx/errors/;
  }
}

Ответ 2

Очень немногая директива в nginx занимает путь файловой системы. Вы хотите что-то вроде:

# The default server.
server {
  listen       80 default_server;
  server_name  everythingelse;

  root /opt/local/html;

  error_page 404 /404.html;

  # Everything is a 404
  location / {
    return 404;
  }

  # EDIT: You may need this to prevent return 404; recursion
  location = /404.html {
    internal;
  }
}

Ответ 3

Переместите директиву error_page вверх в conf, прежде чем вы вызовете возврат 404.

Это должно работать:

# The default server.
#
server {
    listen       80 default_server;
    server_name  everythingelse;
    error_page 404 /error_docs/404.html;

    # Everything is a 404
    location / {
        return 404;
    }

    # Custom Error Page
    location /error_docs {
        alias /opt/local/html/;
        log_not_found  off;
        access_log off;
    }
}

Это будет использовать тот же пользовательский для всех сайтов (серверов). Вам нужно добавить местоположение документации по ошибкам.

http {
error_page 404 /error_docs/404.html;

...

    # The default server.
    #
    server {
        listen       80 default_server;
        server_name  everythingelse;

        # Everything is a 404
        location / {
            return 404;
        }

        # Custom Error Page
        location /error_docs {
            alias /opt/local/html/;
            log_not_found  off;
            access_log off;
        }
    }
}

Ответ 4

Поскольку как root, так и error_page являются действительными директивами в области блоков http, можно использовать поведение наследования конфигурации nginx.

Чтобы разделить пользовательские страницы ошибок между всеми моими vhosts (чтобы запросы на неизвестные vhosts или несуществующие ресурсы в известных vhosts получали мои страницы пользовательских ошибок в ответ в соответствии с определением error_page), я использую следующий рецепт.

1/ Добавьте эти три строки в /etc/nginx/nginx.conf

# …
root /var/www/whatever # Used by undefined hosts
error_page 403 404 =404 /404.html
error_page 502 503 504 =500 /500.html
# …

2/ Создайте /etc/nginx/sites-available/catchall со следующим фрагментом как виртуальный сервер по умолчанию "catch all".

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    # SSL rules here if required
    server_name _;
}

3/ Создавать файлы 404.html и 500.html в каждом корневом каталоге документа должны были использоваться пользовательские ошибки (или связывать их в /var/www/whatever ), в противном случае значения по умолчанию будут вместо этого.

Тем не менее, не все директивы могут наследовать из области более высокого уровня, и, что еще хуже, некоторое наследование не ведет себя так, как мы ожидали бы на первый взгляд. - Понимание структуры конфигурации и конфигурации конфигурации NGINX
- Интересная тема SO: Расположение вложенности

(Используя Debian9 и nginx/1.10.3)

Ответ 5

Перед блоком сервера вы, вероятно, используете инструкцию: include/etc/nginx/conf.d/*.conf;

У меня была та же проблема, чем я только прокомментировал эту строку, и это сработало для меня