2013-08-30 3 views
15

У меня есть HTTP: // и https: // на том же хосте, как следующее:Перенаправление на SSL с помощью Nginx

server { 

    listen 80; 
    listen 443 ssl; 

    ... 
    ... 
} 

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

https://mydomain.com/ан/магазин https://mydomain.com/фр/магазин и т.д ...

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

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

ответ

6

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

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

От documentation:

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

  1. "~" для случая чувствительной сопрягая
  2. "~*" для случая нечувствительного соответствия

С Nginx does't позволяют location блоки должны быть вложены внутрь if блоков, попробуйте следующую конфигурацию:

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

я получил другую ошибку с кодом: Перезапуск Nginx: Nginx: [Экстренно] «место» директива здесь не допускается в –

+2

@AdamSilver: Вы не можете иметь 'location' внутри из' if' блока (см документация местоположения).Просто измените правило перезаписи только для перезаписи, если путь начинается с '(en | fr)/shop'. –

+0

Но я получу цикл переадресации! –

44

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

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

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

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

(Извините за рытье старой темы) Чтобы избежать плохой практики, я думаю, что это должно быть отмечено как ответ. –

+7

вместо доменного имени жесткого кода, мы можем сделать: return 301 https: // $ host $ request_uri; –

+0

@NamNguyen обновлено для вашего предложения, спасибо! – Austio

2

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

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

постоянного заботится о 301.

10

Или еще лучше, избегая имя жёстко прописанных серверов

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

другой способ с 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; 
...