Перенаправить nginx /index.html в корень, вызывая бесконечные перенаправления - PullRequest
0 голосов
/ 03 ноября 2018

Я не хочу, чтобы одна и та же HTML-страница была доступна на www.example.com и www.example.com/index.html, т. Е. Я хочу перенаправить index.html в корневой каталог.

Это:

location = /index.html {
        return 301 $scheme://www.example.com;
}

заставляет меня получить ERR_TOO_MANY_REDIRECTS, цикл перенаправления.

Любые идеи, что я могу изменить, чтобы заставить его работать?

PS это весь мой nginx conf

server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    include /etc/nginx/snippets/ssl-example.com.conf;
    include /etc/nginx/snippets/ssl-params.conf;

    include /etc/nginx/snippets/letsencrypt-challenge.conf;

    root /var/www/newsite;
    index index.php index.html index.htm;

    server_name www.example.com;

    location / {
            # try_files $uri $uri/ =404;
            try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    location = /index.html {
            return 301 $scheme://www.example.com;
    }
}

1 Ответ

0 голосов
/ 03 ноября 2018

Это не детальное рассмотрение предмета, а упрощенное объяснение, чтобы ответить на вашу дилемму. Ответ в том, что вам нужно отказаться от попытки сделать то, что вы делаете.

Веб-серверы могут обслуживать только определенные файлы, такие как файл xyz.html. Они не могут обслуживать папки.

Вызов https://www.example.com/abc/index.html - это запрос файла index.html в папке abc корневого веб-каталога. С другой стороны, вызов https://www.example.com/abc - это запрос к папке abc веб-корня, который, как уже упоминалось, не может быть обработан.

Однако, как вы заметили, при втором вызове https://www.example.com/abc/index.html обслуживается. Это связано с тем, что веб-серверы обычно настраиваются таким образом, чтобы при обращении к папке без указания конкретного файла для обслуживания создавалось перенаправление в файл index.html в этой папке, который вместо этого обслуживается. То есть веб-сервер внутренне превращает запрос на https://www.example.com/abc в запрос на https://www.example.com/abc/index.html.

Это то, что делает строка index index.php index.html index.htm; в вашей конфигурации. Он говорит: «Если есть запрос на папку без указанного файла, вместо этого укажите файл index.php. Если такого файла нет, укажите файл index.html. Если такого файла нет, укажите файл index.htm. . Если этого тоже не существует, подбросьте "

Проблема в том, что вы затем продолжаете инструктировать свой веб-сервер перенаправлять запросы на https://www.example.com/index.html на https://www.example.com, которые веб-сервер перенаправляет обратно на https://www.example.com/index.html, который снова перенаправляется обратно на https://www.example.com в бесконечном цикле до тех пор, пока веб-сервер или ваш браузер наконец сдаются.

Вы заявили, что I want to avoid having the same HTML page accessible on www.example.com and www.example.com/index.html, i.e i want to redirect the index.html to root. Вопрос в том, почему? Это абсолютно бесполезно, и, как вы узнали, вы попадаете в цикл перенаправления.

Возможно, вы пытаетесь кое-что оптимизировать, но здесь это не относится.

...