@sharkynumberone

Как сделать редирект с www на без www и c http на https в nginx proxy?

Задача вроде простая. Имеется Nginx reverse proxy и конфиг хоста

server {
listen 80;
server_name www.demo.ru demo.ru;
return 301 https://$server_name$request_uri;
}

server {
listen 443;
server_name demo.ru www.demo.ru;

ssl_certificate /etc/nginx/certs/demo.ru.crt;
ssl_certificate_key /etc/nginx/certs/demo.ru.key;

ssl on;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;

location / {
proxy_pass http://demo_web;
}
}

При попытке захода на сайте через https://www.demo.ru возвращает 200 статус, хотя должен быть редирект на https://demo.ru. В конечном итоге мне нужно чтобы с demo.ru www.demo.ru https://www.demo.ru был редирект на https://demo.ru . В чем ошибка?
  • Вопрос задан
  • 202 просмотра
Пригласить эксперта
Ответы на вопрос 4
У Вас стоит редирект по http а Вы заходите по https. Попробуйте войти по http.
Ответ написан
У вас там и нет редиректа на без www.
добавьте перед location /
if ($host != 'demo.ru') { return 301 https://demo.ru$request_uri;}


Делать отдельный сервер для редиректа на https тоже не обязательно. Включите оба порта(80/443) на одном и добавьте аналогичный редирект
if ($scheme = 'http') { return 301 https://demo.ru$request_uri;}
Ответ написан
POS_troi
@POS_troi
СадоМазо Админ, флудер, троль.
При попытке захода на сайте через https://www.demo.ru возвращает 200 статус, хотя должен быть редирект.


Не должно быть редиректа, у вас не настроен редирект с поддомена www.
Вам необходимо добавить отдельный блок
server{
  server_name www.demo.ru;
  return 301 $scheme://www.demo.ru$request_uri;
}


ну или имеющийся блок привести к виду
server {
listen 80;
server_name www.demo.ru demo.ru;
return 301 https://www.demo.ru$request_uri;
}

ну или извращаться и вырезать www регекспами :)
Ответ написан
@zevilz
Обычно делаю так:
server {
	listen 80;
	server_name site.com www.site.com;
	rewrite ^(.*) https://$server_name$1 permanent;
}
server {
	listen 443 ssl;
	include ssl/site.com;
	server_name www.site.com;
	rewrite ^(.*) https://site.com$1 permanent;
}
server {
	listen 443 ssl;
	include ssl/site.com;
	server_name site.com;
	...........
	...........
	...........
}

В первой секции редирект http с www и http без www на тот же, но https.
Во второй секции редирект https с www на https без www (тут обязательно должен подключаться сертификат).
В третьей секции все остальное для домена (https без www).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы