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

установить правильный хост запроса, чтобы избежать этого бесконечного цикла в nginx

Я настроил этот сервер nginx для example.com и www.example.com быть кешем / обратным прокси, беря данные с mysource.example.com

Кажется, что в браузере все работает нормально, но я заметил значительное падение рейтинга Google, и когда я протестировал URL-адрес с помощью wget, я получил бесконечный цикл.

# test without www , getting infinite loop
wget --header="Host: example.com" http://[SERVER IP]/file.html


Location: https://www.example.com/file.html [following]
--2020-02-07 21:43:14--  https://www.example.com/file.html
Reusing existing connection to www.example.com:443.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://www.example.com/file.html [following]
20 redirections exceeded.
^^^ RIGHT HERE !!!

# but with www it works OK:
wget --header="Host: www.example.com" http://[SERVER IP]/file.html


HTTP request sent, awaiting response... 200 OK
Length: 1307 (1.3K) [text/plain]
Saving to: ‘file.html’

Думаю, мне нужно указать другой host при перенаправлении с не www на www ?!

Или это просто wget вещь потому что обычно он должен переключаться на www.example.com при первом перенаправлении, но удерживает хост без www от команды nginx?

# redirect http to https
server {
    listen 80;
    server_name example.com;
    server_name www.example.com;

    proxy_set_header Host      www.example.com
    return 301 https://www.example.com$request_uri;
}


# and redirect non www to www
server {
    listen 443 ssl http2;
    server_name example.com;

    proxy_set_header Host      www.example.com;
    return 301 https://www.example.com$request_uri;
}


# main server, SSL
server {

    listen       443 ssl http2;
    server_name  www.example.com;

    location / {

            proxy_pass       http://mysource.example.com:81;

            proxy_set_header Host      www.example.com;

            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;

            proxy_cache             nginx_ramdisk_cache;
    }



} # end of server

Проблема заключается в том, как вы используете wget. Используя:

wget --header="Host: example.com" http://example.com/file.html

вы заменяете Host заголовок каждый просить, чтобы wget выполню. Так:

  1. wget подключается к порту 80 вашего сервера и будет перенаправлен на https://www.example.com/file.html,
  2. wget подключается к порту 443 вашего сервера, но отправляет Host: example.com заголовок вместо Host: www.example.com. Он перенаправляется на https://www.example.com/file.html,
  3. Мы вернулись в 2.

Итак, ваша конфигурация в порядке, в вашем тесте была просто проблема. Вы никогда не должны отменять Host заголовок wget автоматически установит его на домен в URL-адресе.