Как заставить или редирект на SSL в nginx?

У меня есть страница регистрации на поддомене вроде: https://signup.example.com

Это должны быть доступны только через HTTPS, но я'м боишься, что люди будут как-то наткнуться на него через HTTP и получите 404.

В HTML/блок Server в nginx выглядит так:

html {
  server {
    listen 443;
    server_name signup.example.com;

    ssl                        on;
    ssl_certificate        /path/to/my/cert;
    ssl_certificate_key  /path/to/my/key;

    ssl_session_timeout 30m;

    location / {
      root /path/to/my/rails/app/public;
      index index.html;
        passenger_enabled on;
    }
  }
}

Что я могу добавить так, что люди, которые ходят на http://signup.example.com возвращается https://signup.example.com ? (FYI, я знаю, что есть рельсы плагинов, которые могут заставить протокол SSL, но надеялся избежать этого)

Комментарии к вопросу (1)

Лучшим способом, как это описано в официальной инструкции с помощью "возвращение" директива:

server {
    listen      80;
    server_name signup.mysite.com;
    return 301 https://$server_name$request_uri;
}
Комментарии (7)
Решение

По данным nginx и подводных камней, Это'ы немного лучше опустить ненужные захвата, а не с помощью $request_uri. В этом случае, добавьте знак вопроса, чтобы предотвратить nginx и от удвоения любые аргументы запроса.

server {
    listen      80;
    server_name signup.mysite.com;
    rewrite     ^   https://$server_name$request_uri? permanent;
}
Комментарии (7)

Это правильный и самый эффективный способ, если вы хотите сохранить все это в один блок Server:

server {
    listen   80;
    listen   [::]:80;
    listen   443 default_server ssl;

    server_name www.example.com;

    ssl_certificate        /path/to/my/cert;
    ssl_certificate_key  /path/to/my/key;

    if ($scheme = http) {
        return 301 https://$server_name$request_uri;
    }
}

Все остальное выше, используя, что "переписать" или "если ssl_protocol" и т. д. происходит медленнее и хуже.

Вот то же самое, но еще более эффективным, только выполнив переписать по протоколу HTTP, он избегает того, чтобы проверить $схема переменной при каждом запросе. А если серьезно, это's, такие незначительные вещи, которые вы Don'т необходимость их выделения.

server {
    listen   80;
    listen   [::]:80;

    server_name www.example.com;

    return 301 https://$server_name$request_uri;
}
server {
    listen   443 default_server ssl;

    server_name www.example.com;

    ssl_certificate        /path/to/my/cert;
    ssl_certificate_key  /path/to/my/key;
}
Комментарии (6)

Если вы используете новый двойной HTTP и HTTPS определение сервера, вы можете использовать следующее:

server {
    listen   80;
    listen   [::]:80;
    listen   443 default ssl;

    server_name www.example.com;

    ssl_certificate        /path/to/my/cert;
    ssl_certificate_key  /path/to/my/key;

    if ($ssl_protocol = "") {
       rewrite ^   https://$server_name$request_uri? permanent;
    }
}

Это, кажется, работает для меня и это'т вызвать бесконечный цикл перенаправления.

Редактировать:

Заменены:

rewrite ^/(.*) https://$server_name/$1 permanent;

с Пратик'ы переписать строку.

Комментарии (6)

Еще один вариант, который сохраняет заголовок Host: запрос и образом в "хорошие" и пример в nginx и подводных камней:

server {
    listen   10.0.0.134:80 default_server;

    server_name  site1;
    server_name  site2;
    server_name  10.0.0.134;

    return 301 https://$host$request_uri;
}

Вот результаты. Следует отметить, что использование $имя_сервера вместо $хост всегда будет редирект наhttps://site1`.

# curl -Is http://site1/ | grep Location
Location: https://site1/

# curl -Is http://site2/ | grep Location
Location: https://site2/

# curl -Is http://site1/foo/bar | grep Location
Location: https://site1/foo/bar

# curl -Is http://site1/foo/bar?baz=qux | grep Location
Location: https://site1/foo/bar?baz=qux
Комментарии (6)

Убедитесь, что вы установили 'безопасной' на какие-либо cookies, либо они'll быть отправлены по HTTP-запросу и могут быть захвачены инструментом, как Firesheep.

Комментарии (0)
server {
    listen x.x.x.x:80;

    server_name domain.tld;
    server_name www.domian.tld;
    server_name ipv4.domain.tld;

    rewrite     ^   https://$server_name$request_uri? permanent;
}

Это работает лучше, я думаю. х.х.х.X относится к вашему серверу'ы и IP. Если вы работаете с Plesk 12, вы можете сделать это путем изменения "и с nginx.конф" и файл в папке " в файле/var/www и/виртуальных доменов/системы/домена.дву/конф" и на какой домен вы хотите. Не забудьте перезапустить служба nginx после сохранения конфигурации.

Комментарии (1)

Я думаю, что это самое простое решение. Сил не https, а не www-трафик на HTTPS и только на www.

server {
    listen 80;
    listen 443 ssl;

    server_name domain.tld www.domain.tld;

    # global HTTP handler
    if ($scheme = http) {
        return 301 https://www.domain.tld$request_uri;
    }

    # global non-WWW HTTPS handler
    if ($http_host = domain.tld) {
        return 303 https://www.domain.tld$request_uri;
    }
}

Редактирование - апреля 2018: Решение б/н, Если's можно найти в моем посте здесь: https://stackoverflow.com/a/36777526/6076984

Комментарии (4)