Перенаправление на 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;
...