Перенаправление с www на не-www не работает в Nginx с ssl на Ubuntu 16.04 - PullRequest
0 голосов
/ 09 января 2019

У меня есть сайт Meteor 1.6 на капле DigitalOcean Ubuntu 16.04, развернутой с использованием Phusion Passenger и Nginx.

Я настроил ssl на моем сервере.

http://mysite перенаправляет на https://mysite и сайт работает нормально.

Однако http://www.mysite перенаправляет на https://mysite, и все, что отображается, это страница Nginx по умолчанию "Welcome to nginx!".

Я следовал инструкциям и пробовал что-то из других сообщений на форуме, и я не могу найти, что не так с моей настройкой.

DNS-записи с панели управления DigitalOcean:

A   www.mysite.org directs to xxx.xx.xx.xx 3600
A   mysite.org directs to xxx.xx.xx.xx 1800

Затем я настроил ssl, используя Certbot и LetsEncrypt, следуя этому руководству: https://www.digitalocean.com/community/tutorials/how-to-set-up-let-s-encrypt-with-nginx-server-blocks-on-ubuntu-16-04

И я добавил серверный блок для перенаправления www в обычный домен, следуя этому руководству: https://www.digitalocean.com/community/tutorials/how-to-redirect-www-to-non-www-with-nginx-on-ubuntu-14-04

Вот мой конфиг nginx:

sudo nano /etc/nginx/sites-enabled/mysite.conf

server {
    server_name mysite.org www.mysite.org;

    ...Meteor app config

    # added by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mysite.org/fullchain.pem$
    ssl_certificate_key /etc/letsencrypt/live/mysite.org/privkey.p$
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

# added by me
server {
    server_name www.mysite.org;
    return 301 $scheme://mysite.org$request_uri;
}

# added by Certbot
server {
    if ($host = mysite.org) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    server_name mysite.org;
    return 404; # managed by Certbot
}

Я попытался добавить это в свой блок перенаправления сервера, но это не имело значения:

listen 80;
listen 443 ssl;

Есть какие-нибудь идеи, как я могу получить перенаправление www.mysite -> mysite на работу? Спасибо!

Обновление: я попробовал ответ flaixman в другом приложении, приложение Django в другой капле, и это сработало. Но я все еще не могу получить перенаправление на работу в моем приложении Meteor. На обоих сайтах записи A и CNAME настроены одинаково.

Вот мой конфиг Meteor, основанный на ответе flaixman:

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

server {
    listen 443 ssl http2; #https of www*, 301 to right domain.
    server_name www.example.org;

    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.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

    return 301 https://example.org$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.org;

    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.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

    # Tell Nginx and Passenger where your app's 'public' directory is
    root /var/www/example/bundle/public;

    # Turn on Passenger
    passenger_enabled on;
    # Tell Passenger that your app is a Meteor app

    passenger_app_type node;
    passenger_startup_file main.js;

    # Tell your app where MongoDB is
    passenger_env_var MONGO_URL mongodb://localhost:27017/example;
    passenger_env_var MONGO_OPLOG_URL mongodb://localhost:27017/local;

    # Tell your app what its root URL is
    passenger_env_var ROOT_URL http://example.org;
}

В моем журнале ошибок nginx /var/log/nginx/error.log я вижу это сообщение:

2019/01/17 17:30:52 [warn] 7786#7786: conflicting server name "www.example.org" on 0.0.0.0:80, ignored
2019/01/17 17:30:52 [warn] 7786#7786: conflicting server name "www.example.org" on 0.0.0.0:443, ignored
2019/01/17 17:30:52 [warn] 7789#7789: conflicting server name "www.example.org" on 0.0.0.0:80, ignored
2019/01/17 17:30:52 [warn] 7789#7789: conflicting server name "www.example.org" on 0.0.0.0:443, ignored

Я ожидаю, что это будет означать, что у меня есть дублирующая директива прослушивания в моем файле настроек, но я не вижу ничего? Я проверил с помощью ls -a, и в папке нет второй копии файла conf.

Ошибка может быть связана с ошибкой перенаправления, но я не вижу, что является причиной ошибки?

Снова отредактируйте: я наконец нашел дубликаты директив прослушивания в / etc / nginx / sites-available / default. Не уверен, что Certbot вставил их или я сам поставил их туда, когда я настраивал сервер ... в любом случае, комментирование их, похоже, решило проблему. Возможно, что-то в инструкциях Phusion Passenger по настройке серверных блоков конфликтует с инструкциями LetsEncrypt? В любом случае, yay для журнала ошибок nginx!

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Stackoverflow сказал мне, что mysite не был подходящим доменом для использования в качестве примера, поэтому я изменил все на «example» вместо «mysite»

Полагаю, вам нужно перенаправить все на https example.org, не так ли? Вот как должен выглядеть ваш код:

Запросы, поступающие с http, на самом деле не имеет значения, если хост идет как www * или без www. Все будет перенаправлено на хост без www, а через https

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

Если хост - www * и проходит через https, перенаправьте на https без www. Кстати, здесь вам нужно будет использовать сертификат для www.example.org, потому что без сертификата соединение не защищено.

server {
    listen 443 ssl http2; #https of www*, 301 to right domain.
    server_name www.example.org;
    #are you sure those 2 paths are right? with the final $.
    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem$
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.p$
    include /etc/letsencrypt/options-ssl-nginx.conf; 
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 

    return 301 https://example.org$request_uri;
}

И, наконец, если это происходит с правильной схемой и с правильным хостом, делайте что хотите.

server {
    listen 443 ssl http2;
    server_name example.org;

    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem$
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.p$
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    #do what you want to do here.
}

Если у вас есть какие-либо сомнения или что-то, что я пропустил в вашем объяснении, просто прокомментируйте это, и я исправлю это так быстро, как смогу.

0 голосов
/ 09 января 2019

Проверьте настройки DNS. У вас должна быть запись CNAME или A "www".

www A   ip

или

www CNAME   domain.com

также вам нужно добавить параметр прослушивания в ваш блок

listen 443 ssl http2;

РЕДАКТИРОВАТЬ: на основе комментариев.

Добавьте это наверх в вашей конф.

server {
  server_name mysite.org www.mysite.org;
  if ($server_name ~* \.mysite.org$) {
    return 301 $scheme://mysite.org$request_uri;
  }
  ...Meteor app config    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...