2013-08-30 19 views
15

ho http: // e https: // sullo stesso host come il seguente:Reindirizzamento a SSL utilizzando nginx

server { 

    listen 80; 
    listen 443 ssl; 

    ... 
    ... 
} 

Che cosa devo fare è reindirizzare gli utenti che accedono al mio negozio per https://. Il problema è che ho molte lingue:

https://mydomain.com/it/negozio https://mydomain.com/fr/negozio ecc ...

Ho provato questo e non ha funzionato (nginx: configuration file /etc/nginx/nginx.conf test failed):

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

risposta

6

Per utilizzare le espressioni regolari per la corrispondenza di location s, è necessario prefisso l'espressione con ~ o ~*:

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

Dal documentation:

Per usare le espressioni regolari, è necessario utilizzare un prefisso:

  1. "~" per case sensitive corrispondenza
  2. "~*" per case insensitive corrispondenza

Da nginx does't permettono location blocchi da annidati l'uno dentro if blocchi, provare la seguente configurazione:

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

ho ottenuto un altro errore con il tuo codice: Riavvio nginx: nginx: [emerg] "location" direttiva non è permesso qui in –

+2

@AdamSilver: Non si può avere 'location' all'interno di un blocco' if' (vedi documentazione della sede).Basta cambiare la regola di riscrittura per riscrivere solo se il percorso inizia con '(en | fr)/shop'. –

+0

Ma otterrò un ciclo di reindirizzamento! –

44

sarebbe anche più di una migliore pratica NGINX fare un reindirizzamento 301 invece di utilizzare la dichiarazione if (vedere il nome del server su http://wiki.nginx.org/Pitfalls). Ho creato una sostanza con una nginx.conf configurato per SSL, Rails e Unicorn

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

Qui sarebbe l'apposita sezione per il vostro.

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

(Mi dispiace per aver scavato una vecchia discussione) Per evitare cattive pratiche, penso che questa dovrebbe essere contrassegnata come risposta. –

+7

invece del nome di dominio del codice hard, possiamo fare: return 301 https: // $ host $ request_uri; –

+0

@NamNguyen aggiornato per il tuo suggerimento, grazie! – Austio

2

Idealmente, evitando se le dichiarazioni preservando il percorso finale:

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

permanente si occupa della 301.

10

O meglio ancora, evitando il nome del server hardcoded

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

un altro modo con 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; 
... 
Problemi correlati