Почему Nginx принимает любое значение URL после корневого домена?

Почему Nginx принимает любое значение URL после корневого домена?

Первый раз настраиваю Nginx, и моя цель — чтобы example.com со статической страницей 'index.html' обслуживался с помощью минималистской конфигурации, ничего больше. Я также хочу убрать поддомен www. Вот мои блоки сервера sites-available:

server {
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    server_name example.com;
    root /var/www/example.com/;
    index index.html index.htm;

    location / {
            try_files $uri $uri/ /index.html;
    }
}

Если я использую www.example.com или example.com, то они работают нормально, а www автоматически удаляется.

Проблема в том, что я могу ввести что угодно после example.com, и страница index.html все равно загружается, например example.com/ABC или example.com/12345.Эти страницы не существуют, почему URL-адреса принимаются? Я бы ожидал, что любой URL, кроме корневого домена, вернет страницу 404.

Это, вероятно, очень простая проблема, но я пробовал искать здесь и в документации, но пока ничего не нашел.

решение1

Кажется, это правильное поведение предложения try_files. Из вики nginx:

Проверяет наличие файлов по порядку и возвращает первый найденный файл. Завершающий слеш указывает на каталог - $uri /. В случае, если файл не найден, вызывается внутреннее перенаправление на последний параметр. Обратите внимание, что только последний параметр вызывает внутреннее перенаправление, предыдущие просто устанавливают внутренний указатель URI.

Поэтому, если вы ищете ABC или 12345, но их не удается найти, срабатывает внутреннее перенаправление на index.html.

Попробуйте с:

location / {
    try_files $uri $uri/ =404;
}

Полную справку смотрите здесь:

http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files

Основано на произведении Мартина ФьордвальдакомментарийВот минимальная конфигурация для двух серверных блоков, протестированная и рабочая:

server {
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    server_name example.com;
    root /var/www/example.com/;
    index index.html index.htm;
}

решение2

Мне пришли в голову две вещи:

либо у вас есть rewriterule обратно в index.html

или возможно у вас есть пользовательская страница 404, которая связана с index.html

по крайней мере, это две идеи, которые я бы проверил в первую очередь.

Другим возможным решением была бы проверка журналов, установка значений для отладки и проверка того, что «перенаправляет» вас обратно на index.html. К сожалению, я недостаточно хорошо знаю nginx, чтобы помочь вам в дальнейшем.

Связанный контент