Перенаправление на SSL с помощью nginx

У меня есть http://и https://на том же хосте, что и в следующем:

server {

    listen   80;
    listen   443 ssl;

    ...
    ...
}

Что мне нужно сделать, это перенаправить пользователей, которые обращаются к моему магазину, в https://. Проблема в том, что у меня много языков:

https://mydomain.com/ ru/магазин https://mydomain.com/ fr/магазин и т.д...

Я пробовал это, и он не работал (nginx: configuration file /etc/nginx/nginx.conf test failed):

if ($server_port = 80) {
    location (en|fr)/shop {
        rewrite ^ https://$host$request_uri permanent;
    }
}

Ответы

Ответ 1

Чтобы использовать регулярные выражения для сопоставления location s, вам нужно префикс выражения с помощью ~ или ~*

if ($server_port = 80) {
    location ~ (en|fr)/shop {
        rewrite ^ https://$host$request_uri permanent;
    }
}

В документации :

Чтобы использовать регулярные выражения, вы должны использовать префикс:

  • "~" для чувствительного к регистру соответствия
  • "~*" для нечувствительного к регистру соответствия

Так как nginx не разрешает встраивать блоки location внутри блоков if, попробуйте следующую конфигурацию:

if ($server_port = 80) {
    rewrite ^/(en|fr)/shop https://$host$request_uri permanent;
}

Ответ 2

Было бы также лучше использовать NGINX для переадресации 301 вместо использования оператора if (см. имя сервера http://wiki.nginx.org/Pitfalls). Я создал gist с nginx.conf, настроенным для SSL, Rails и Unicorn

https://gist.github.com/Austio/6399964

Здесь будет соответствующий раздел для вашего.

server {
    listen      80;
    server_name domain.com;
    return 301  https://$host$request_uri;
}

Ответ 3

Или еще лучше, избегая строгого имени сервера

server {
  listen 80;
  rewrite (.*) https://$http_host$1 permanent;
}

Ответ 4

В идеале избегайте операторов if, сохраняя конечный путь:

server {
  listen 80;
  server_name example.com;
  rewrite (.*) https://example.com$1 permanent;
}

Постоянный заботится о 301.

Ответ 5

другой способ с error_page 497

server {
    listen 80;
    listen 443;

    ssl on;
    error_page 497  https://$host$request_uri;
    ssl_certificate     /etc/ssl/certs/ssl-cert-snakeoil.pem;
    ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
...