Задать вопрос
@vekozlov

Редирект с nginx + upstream. Как?

Товарищи, подскажите как настроить nginx.

Задача:
1. сделать редирект с www на без-www
Кусок кода нашел вроде (он работает на другом сервере), но на продакшене - не работает. Куда его ткнуть?

server {
server_name www.DOMAINDOMAIN.ru;
return 301 https://DOMAINDOMAIN.ru$request_uri;
}

2. Выполнить 301 редирект с https://questplanet.ru//// на https://questplanet.ru
То есть сделать редирект при любом количестве слешей ( многослешевостью).

3. Также стоит поправить момент со слешем он должен быть у всех внутренних страниц, а у главной его быть не должно.

Пример:
https://DOMAINDOMAIN.ru
https://www.DOMAINDOMAIN.ru/vip/

upstream app_server {
  server unix:/home/deployer/projects/DOMAINDOMAIN/shared/unicorn/DOMAINDOMAIN.sock  fail_timeout=0;
}

server {
  root /home/deployer/projects/DOMAINDOMAIN/current/public;
  #server_name 92.53.120.72;

  server_name DOMAINDOMAIN.ru; # removed ww version
  keepalive_timeout 5;
  client_max_body_size 50m;

  index index.htm index.html;

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

  location ~* ^.+\.(jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|mp3|flv|mpeg|avi)$ {
    try_files $uri @app;
    expires 1y;
    log_not_found off;
  }

  location @app {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }

  location ~* .(woff2|woff|otf|css|js)$ {
    expires 30d;
  }

  error_page 500 502 503 504 /500.html;

  location = /500.html {
    root /home/deployer/projects/DOMAINDOMAIN/current/public;
  }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/DOMAINDOMAIN.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/DOMAINDOMAIN.ru/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 {
  if ($host = www.DOMAINDOMAIN.ru) {
    return 301 https://$host$request_uri;
  } # managed by Certbot

  if ($host = DOMAINDOMAIN.ru) {
    return 301 https://$host$request_uri;
  } # managed by Certbot

  if ($request_uri ~ "^\/(.*)[^\/]$") {
    return 301 $1/;
  }

  listen 80 default deferred;
  server_name DOMAINDOMAIN.ru;# www.DOMAINDOMAIN.ru;
  return 404; # managed by Certbot
}
  • Вопрос задан
  • 229 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@MadridianFox
Web-программист, многостаночник
У вас основная секция server слушает 443, а новые правила редиректов вы вставили в server, который слушает 80 и предназначен для редиректов http -> https
Кроме того, в www редиректе вы не меняете хост, т.е. даже если он отработает, то он вызовет бесконечный редирект.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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