Nginx редирект 301: Как настраивать редиректы на веб-сервере NGINX 🔄

nginx — Как убрать бесконечный редирект после установки сертификата?

Вопрос задан

Изменён 5 месяцев назад

Просмотрен 93 раза

Перебрал уже целую кучу мануалов, но ситуация не меняется, попадаю в цикличный редирект после установки SSL сертификата и настройки сервера nginx. Может кто указать, где ошибка:

 server {
listen 80;
server_name www.wherefilmed.org wherefilmed.org;
return 301 $scheme://wherefilmed.org$request_uri;
}
server {
listen 443 ssl default_server;
server_name www.wherefilmed.org wherefilmed.org;
ssl_certificate /etc/letsencrypt/live/wherefilmed.org/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/wherefilmed.org/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.
conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/ugrobug/wherefilmed; } location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } } server { if ($host = www.wherefilmed.org) { return 301 https://$host$request_uri; } # managed by Certbot server_name www.wherefilmed.org; listen 80; return 404; # managed by Certbot } server { if ($host = wherefilmed.org) { return 301 https://$host$request_uri; } # managed by Certbot server_name wherefilmed.org; listen 80; return 404; # managed by Certbot }
  • nginx
  • ssl

3

Уберите фрагент:

 server {
listen 80;
server_name www.wherefilmed.org wherefilmed.org;
return 301 $scheme://wherefilmed.org$request_uri;
}

И еще нет неоходиости в условии т.к. в этот блок server не попадет хост иной чем www.

wherefilmed.org:

if ($host = www.wherefilmed.org) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name www.wherefilmed.org;

В другом блоке server аналогично не нужно условие. И не забудьте перечитать конфиг командой nginx -s reload

2

Вечер добрый! Пересоздайте сертификат letsencript используя cerbot, с параметром no redirect , Так как , с большой вероятностью в выбрали 1 параметр , а именно он и влияет на редирект (прописывая уже https в сертификат , за счёт чего и возникает циклическая переадресация ), копаться в настройках nginx нет смысла .

3

В итоге сработала следующая настройка сервера.

    server {
   if ($host = wherefilmed.org) {
       return 301 https://$host$request_uri;
   } # managed by Certbot
    listen 80;
    server_name wherefilmed. org;
    return 404; # managed by Certbot
}
server {
    listen 80;
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/wherefilmed.org/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/wherefilmed.org/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    server_name wherefilmed.org;
    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/ugrobug/wherefilmed;
    }
     location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

nginx примеры редиректов — FRYAHA.

— Эта метка означает начала строки.
$ — Эта метка означает конец строки.
\ — Эта экранирующий слэш, позволяет считать следующий за ним символ, обычным символом.
() – Этот символ обозначает группировку.
! – Метка отрицания.
+ — Этот символ повторяется от 1 до 65536 раз.
? — Этот символ повторяется 0 или 1 раз.
* — А этот символ повторяется от 0 до 65536 раз.
Флаги определяют дополнительные опции.
R — (redirect) — По умолчанию останавливает процесс преобразования, возвращает результат в браузер клиента, как редирект на данную страницу 302, MOVED TEMPORARY. Например флагу можно указать другой код результата, R=301 и он возвратит редирект клиенту с кодом 301 MOVED PERMANENTLY.
NC — (nocase) — Этот флаг отключает проверку регистра символов. |\.)my_site\.local$»;

Сделал редирект для всех доменов с www на без www.

Понадобилось в url убирать лишние слэши.
Допустим есть урл у сайта:
site.local/mon////site//my
делать 301 редирект на:
site.local/mon/site/my

rewrite (.*?)//+(.*) $1/$2 permanent;

Вот и вся мини инструкция nginx примеры редиректов.

Непредвиденная переадресация 301 из Nginx, когда за обратным прокси-сервером Nginx

Подобные вопросы уже задавались здесь и здесь, но ни один из них не соответствовал моей проблеме и не решил ее. После нескольких часов безнадежного решения проблемы я нашел решение, которое было настолько неожиданным, но простым, что я захотел поделиться им в стиле вопросов и ответов.

Справочная информация

В компании есть два сервера: обратный прокси-сервер (Ubuntu 20.04 + Nginx 1.17) и вышестоящий сервер приложений (также Ubuntu 20.04 + Nginx 1.17). Обратный прокси обрабатывает различные поддомены, например. http://demo. example.com и сопоставляет их с каталогом на вышестоящем сервере, например. http://12.12.12.12:8000/demo/ с помощью директивы proxy_pass.

Затем клиент делает HTTP-запрос, в котором путь указывает на каталог, но не имеет завершающей косой черты, например. http://demo.example.com/items . По умолчанию Nginx выполняет перенаправление 301 на тот же URL-адрес с добавлением косой черты в конце, например. http://demo.example.com/items/ , как указано в документах местоположения.

Если перенаправление 301 происходит на вышестоящем сервере приложений, то нормальным поведением является то, что путь местоположения перенаправления становится http://12.12.12.12:8000/demo/items/ . Это не проблема, поскольку по умолчанию обратный прокси-сервер заменяет часть 12.12.12.12:8000/demo/ исходным хостом, и, таким образом, клиент получает правильное перенаправление 301 на demo.example.com/items/. Я ожидал, что это произойдет.

Проблема

Однако с приведенной ниже конфигурацией место перенаправления, которое получает клиент, становится http://demo.example.com:8000/demo/items/ вместо . Похоже, что обратный прокси-сервер лишь частично переписывает URL-адрес перенаправления.

Конфигурация сайта на обратном прокси:

 сервер {
  слушать 80;
  слушать [::]:80;
  индекс index.html index.htm;
  имя_сервера demo.example.com;
  место расположения / {
    proxy_pass http://12.12.12.12:8000/demo/;
    proxy_set_header Хост $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $ схема;
  }
}
 

Конфигурация сайта на сервере приложений:

 сервер {
  слушать 8000;
  слушать [::]:8000;
  корень /var/www/example.com;
  индекс index.html index.htm;
  место расположения / {
    try_files $uri $uri/ =404;
  }
}
 

Что я пробовал

Чтобы решить проблему, но безуспешно, я пробовал различные комбинации и значения директив proxy_redirect, absolute_redirect, server_name_in_redirect и port_in_redirect, как предлагалось в аналогичных вопросах. Либо директивы не действовали, либо лишь частично исправили проблему, например, скрыли порт. 9/(.*) /demo/$1 перерыв; с proxy_pass http://12.12.12.12:8000/. Это сработало, как и ожидалось, но не повлияло на перенаправление.

Я также пытался заменить строку try_files на try_files $uri $uri/index.html $uri/ =404 , как предлагается здесь, но, очевидно, безуспешно. Перенаправление с http://demo.example.com/items упрямо сохраняло свое местоположение на http://demo.example.com:8000/demo/items/ .

Я чувствую, что это не должно быть таким сложным. Что мне не хватает?

Как создать 4 типа переадресации NGINX

NGINX можно использовать в качестве веб-сервера (вместо Apache) или прокси-сервера. Для тех, кто использует его в качестве веб-сервера, создание перенаправлений NGINX требует редактирования файлов конфигурации сервера. Это отличается от Apache, который также проверяет файлы . htaccess во время запросов к веб-серверу. NGINX не использует .htaccess. Нужно знать, как перенаправить HTTP на HTTPS в NGINX? Не волнуйся. Это простой процесс, такой же простой, как скрытие версии вашего сервера NGINX. Ниже мы расскажем, как:

  • Создание перенаправлений NGINX
    • Перенаправление с HTTP на HTTPS
    • Перенаправление на Force www
    • Перенаправление для домена
    • Постоянное перенаправление для одного файла
X

на ваш веб-сервер как root пользователя SSH. Отредактируйте файл конфигурации NGINX с помощью Nano, Vim, Emacs и т. д. Мы будем редактировать файлы конфигурации домена в каталоге

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

 nano /etc/nginx/sites-enabled/default 
 vim /etc/nginx/sites-enabled/example.com 

Игнорируя строки комментариев, файл по умолчанию будет напоминать следующий блок кода:

 server {
слушать 80 default_server;
слушать [::]:80 default_server;
корень /var/www/html;
индекс index. html index.htm index.nginx-debian.html;
имя сервера _;
место расположения / {
try_files $uri $uri/ =404;
}
} 

Большинство приведенных ниже изменений можно выполнить в существующем коде. Просто не забудьте перезапустить NGINX после внесения изменений, чтобы они вступили в силу.

 systemctl перезапустить nginx 

Чтобы сэкономить время на устранение неполадок, отмените проблемы с кэшированием, проверив изменения в сеансе приватного просмотра.

Перенаправить HTTP на HTTPS

Чтобы принудительно зашифровать соединения, добавьте следующее в новую строку под имя_сервера _; :

 возврат 301 https://$host$request_uri; 

Вы можете установить бесплатный SSL-сертификат с проверкой домена с помощью Certbot.

Перенаправление на Force www

Решение явно использовать «www» или нет для вашего веб-сайта улучшает поисковую оптимизацию (SEO). Сначала добавьте следующее над существующей строкой server { :

 server {
слушай       80;
имя_сервера  www.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *