2013-08-30 20 views
15

mam http: // i https: // na tym samym serwerze, jak poniżej:Przekierowanie do SSL przy użyciu nginx

server { 

    listen 80; 
    listen 443 ssl; 

    ... 
    ... 
} 

Co muszę zrobić, to przekierowanie użytkowników, którzy dostęp do mojego sklepu na https://. Problemem jest to, że mają wiele języków:

https://mydomain.com/en/Sklep https://mydomain.com/fr/sklep etc ...

próbowałem tego i to nie działa (nginx: configuration file /etc/nginx/nginx.conf test failed):

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

Odpowiedz

6

Aby używać wyrażeń regularnych do dopasowywania location s, należy poprzedzić wyrażenie za pomocą ~ lub ~*:

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

Od documentation:

Aby użyć wyrażeń regularnych, należy użyć prefiksu:

  1. "~" dla przypadku wrażliwej pasującego
  2. "~*" dla przypadku niewrażliwe pasującego

Od nginx does't pozwalają location bloki być zagnieżdżone wewnątrz if bloków, spróbuj następującej konfiguracji:

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

mam kolejny błąd z kodem: Ponowne nginx: nginx: [emerg] „location” dyrektywa nie wolno tu –

+2

@AdamSilver: Nie można mieć 'location' wewnątrz z' bloku if' (patrz dokumentacja lokalizacji).Po prostu zmień regułę przepisywania, aby przepisała tylko, jeśli ścieżka zaczyna się od '(en | fr)/shop'. –

+0

Ale dostanę pętlę przekierowania! –

44

byłoby również bardziej z najlepszych praktyk nginx zrobić przekierowanie 301 zamiast korzystania instrukcja if (patrz Nazwa serwera na http://wiki.nginx.org/Pitfalls). I stworzył istotę z nginx.conf skonfigurowany dla protokołu SSL, szyny i Unicorn

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

Tu byłby odpowiedni dział dla Ciebie.

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

(Przepraszam za wykopanie starego wątku) Aby uniknąć złych praktyk, myślę, że to powinno być oznaczone jako odpowiedź. –

+7

zamiast nazwy twardego kodu, możemy wykonać: return 301 https: // $ host $ request_uri; –

+0

@NamNguyen zaktualizowano o Twoją sugestię, dzięki! – Austio

2

Idealnie, unikając if zachowując ścieżkę spływu:

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

stałe dba o 301.

10

Albo jeszcze lepiej, unikając Hardcoded nazwę serwera

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

innym sposobem z 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; 
... 
Powiązane problemy