2013-08-30 45 views
15

Tôi có http: // và https: // trên cùng một máy chủ như sau:Chuyển hướng đến SSL sử dụng nginx

server { 

    listen 80; 
    listen 443 ssl; 

    ... 
    ... 
} 

Những gì tôi cần làm là chuyển hướng người dùng truy cập vào cửa hàng của tôi để https://. Vấn đề là tôi có nhiều ngôn ngữ:

https://mydomain.com/en/cửa hàng https://mydomain.com/fr/cửa hàng vv ...

tôi đã cố gắng này và nó đã không làm việc (nginx: configuration file /etc/nginx/nginx.conf test failed):

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

Trả lời

6

Để sử dụng cụm từ thông dụng để đối sánh location s, bạn cần phải thêm tiền tố biểu thức bằng ~ hoặc ~*:

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

Từ documentation:

Để sử dụng biểu thức thông thường, bạn phải sử dụng một tiền tố:

  1. "~" đối với trường hợp nhạy cảm phù hợp với
  2. "~*" đối với trường hợp không nhạy cảm phù hợp với

Kể từ nginx does't phép location khối để được lồng vào bên trong của if khối, hãy thử các cấu hình sau:

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

tôi nhận được một lỗi với mã của bạn: Khởi động lại nginx: nginx: [emerg] "location" chỉ thị không được phép ở đây trong –

+2

@AdamSilver: Bạn có thể không có 'location' bên trong một' khối if' (xem tài liệu của vị trí).Đơn giản chỉ cần thay đổi bạn viết lại quy tắc để chỉ viết lại nếu đường dẫn bắt đầu bằng '(en | fr)/shop'. –

+0

Nhưng tôi sẽ nhận được một vòng lặp chuyển hướng! –

44

Nó cũng sẽ là nhiều hơn một thực hành tốt nhất Nginx để làm một chuyển hướng 301 thay vì sử dụng câu lệnh if (xem Tên máy chủ trên http://wiki.nginx.org/Pitfalls). Tôi tạo ra một ý chính với một nginx.conf cấu hình cho SSL, Rails và Unicorn

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

Dưới đây sẽ là phần có liên quan cho bạn.

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

(Xin lỗi vì đào một chủ đề cũ) Để tránh thực hành xấu, tôi nghĩ rằng điều này nên được đánh dấu là câu trả lời. –

+7

thay vì tên miền mã cứng, chúng tôi có thể làm: trả lại 301 https: // $ host $ request_uri; –

+0

@NamNguyen đã cập nhật đề xuất của bạn, cảm ơn! – Austio

2

Một cách lý tưởng, tránh nếu phát biểu trong khi vẫn giữ các đường dẫn dạng vạch:

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

vĩnh viễn chăm sóc của 301.

10

Hoặc tốt hơn, tránh tên máy chủ hardcoded

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

một cách khác với 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; 
... 
Các vấn đề liên quan