LINUX.ORG.RU
ФорумAdmin

Как подружить www to non-www редирект вместе с http to https редиректом?

 ,


0

1

Есть обратиться к домену http://mydomain.com/ или https://www.mydomain.com/ – всё ок – перекинет на https://mydomain.com/

Но если обратиться к http://www.mydomain.com/ – вижу заглушку «Welcome to nginx!»

Конфиг тут: https://pastebin.com/NQU8adQD

★★★★★

Зачем ты www.mydomain и mydomain разместил в разных блоках? Размести их в одном блоке, и там же напиши редирект.

Original_1
()
Ответ на: комментарий от Original_1

Ты про этот блок?

server
{
    if ($host = crynet.tech) {
        return 301 https://$host$request_uri;
    } # managed by Certbot
 
 
  listen 80;
  server_name crynet.tech;
    return 404; # managed by Certbot
 
}

Мне его Certbot выдал.

Размести их в одном блоке, и там же напиши редирект

Знал бы как – не создавал бы тему. Для меня конфиги Nginx это темный лес.

CryNet ★★★★★
() автор топика
Ответ на: комментарий от CryNet

Я про

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

Знал бы как – не создавал бы тему. Для меня конфиги Nginx это темный лес.

Попробуй

listen 80;
server_name mydomain.com www.mydomain.com;

if ($host = "www.mydomain.com")
{
    return 301 $scheme://mydomain.com$request_uri;
}
Original_1
()
Ответ на: комментарий от CryNet

Для меня конфиги Nginx это темный лес.

С таким подходом даже не пытайся делать никакой веб кроме статических сайтов. Будут одни проблемы. Или разберись таки в этом примитивном формате конфигов.

firkax ★★★★★
()
Ответ на: комментарий от Original_1

Не могу отредактировать. Это уже в блоке listen 443 ssl, конечно же.

Original_1
()
server {
  listen 80;
  server_name www.mydomain.com
  return 301 https://mydomain.com$request_uri;
}
 
server {
  listen 443 ssl;
  server_name mydomain.com;
  # НЕ ИСПОЛЬЗУЙ НИКАКИЕ КОДИРОВКИ КРОМЕ UTF-8!!!!!!!!!!!!!!
  #charset koi8-r;
 
  # Выноси настройки в отдельные файлы!!!!!!!!!!!!!!!!!!!
  # например, includes/ssl.conf, а потом пиши что-то типа:
  # include includes/ssl.conf; 
  ssl_certificate /etc/ssl/certs/wildcard.domain.com/cert.crt;
  ssl_certificate_key /etc/ssl/certs/wildcard.domain.com/private.key;
  ssl_session_timeout 15m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers kEECDH+AESGCM+AES128:kEECDH+AES128:kRSA+AESGCM+AES128:kRSA+AES128:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2;
  ssl_prefer_server_ciphers on;


  #STORE the nginx access logs for this app here
  access_log /var/log/nginx/mydomain.com.access.log;
  #Store the error logs for this app here
  error_log /var/log/nginx/mydomain.com.error.log;

  
tz4678_2
()
Ответ на: комментарий от tz4678_2

@Original_1

Всем спасибо. Я допустил ошибку сгенерировав серт только для mydomain.com командой:

sudo certbot --nginx -d mydomain.com, а нужно было так: sudo certbot --nginx -d mydomain.com -d www.mydomain.com

CryNet ★★★★★
() автор топика
Ответ на: комментарий от firkax

Та понимаешь я кодер. Но вот для своего пет-проекта пришлось возиться с настройкой сервака. Я не был готов к этому))

CryNet ★★★★★
() автор топика
Ответ на: комментарий от CryNet

Та понимаешь я кодер. Но вот для своего пет-проекта пришлось возиться с настройкой сервака. Я не был готов к этому))

Зря. Будь готов!

Заодно и код улучшится.

Oldboy
()
Последнее исправление: Oldboy (всего исправлений: 1)
Ответ на: комментарий от Oldboy

Та думаю это мой не единственный опыт, так что придёться учиться

CryNet ★★★★★
() автор топика

vhosts.d/mydomain.com.conf

server {
    listen 80;
    listen 443 ssl http2;

    server_name .mydomain.com;

    include conf.d/redirect-to-https-nonwww.conf;

    .....
}

conf.d/redirect-to-https-nonwww.conf

if ($https_nonwww_url != ''){ return 301 $https_nonwww_url; }

nginx.conf

http {
    .....

    map $https:$host $https_nonwww_url {
        default          '';
        ~*:www\.(.*)$    https://$1$request_uri;    # запросили домен с www, не важно по какому протоколу
        ~*^:             https://$host$request_uri; # если не сработало предыдущее условие, то домен без www, проверим протокол
    }

    .....
}
spirit ★★★★★
()

Проверка:

$ for proto_host in http{,s}://{,www.}mydomain.com; do \
    echo "test for $proto_host";                       \
    curl -k -I                                         \
        --resolve mydomain.com:80:127.0.0.1            \
        --resolve mydomain.com:443:127.0.0.1           \
        --resolve www.mydomain.com:80:127.0.0.1        \
        --resolve www.mydomain.com:443:127.0.0.1       \
        "$proto_host/path/to/page?qwe=asd";            \
done
test for http://mydomain.com
HTTP/1.1 301 Moved Permanently
Location: https://mydomain.com/path/to/page?qwe=asd

test for http://www.mydomain.com
HTTP/1.1 301 Moved Permanently
Location: https://mydomain.com/path/to/page?qwe=asd

test for https://mydomain.com
HTTP/2 200

test for https://www.mydomain.com
HTTP/2 301
location: https://mydomain.com/path/to/page?qwe=asd
spirit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.