Nginx: forza SSL su un path, non SSL su altri

Come posso impostare Nginx conf file per forzare SSL su solo uno dei routes nel mio sito e non SSL su tutto il resto?

Ad esempio, voglio che tutti gli URL sotto / utente siano https, ma tutti gli altri URL devono essere http.

  • HTTPS utilizza TCP o UDP?
  • nginx: a monte con più direttive del server?
  • NGINX Consenti / nega basato sulla combinazione IP & User Agent
  • Consente di crittografare OpenVPN AS
  • Come posso fare apache richiedere un certificato SSL client senza bisogno di verificarlo contro una CA nota?
  • NGINX add_header, aggiungendo più intestazioni
  • Per la prima parte ho:

    rewrite ^/user(.*) https://$http_host$request_uri?; 

    Non voglio usare "se". Suppongo che avrebbe approfittato dell'ordine di funzionamento ma non voglio finire in un ciclo.

  • Qual è l'impostazione corretta del fastcgi_param di Nginx SCRIPT_FILENAME?
  • File System BestReplicated - piccoli file statici
  • Nginx carica il progresso combinato con la richiesta normale
  • Posso alias tutte le richieste di directory in un singolo file in nginx?
  • Nginx log proxy_passed intestazione personalizzata
  • uwsgi_params non in nginx
  • 2 Solutions collect form web for “Nginx: forza SSL su un path, non SSL su altri”

    Nella configuration di nginx, dovresti avere due aree "server". Uno per la port 80 e uno per la port 443 (non SSL e SSL). Basta aggiungere una posizione nel tuo sito web non SSL per redirect alla tua pagina SSL.

     server { root /var/www/ location / { } location /user { rewrite ^ https://$host$request_uri? permanent; } } 

    inoltrerà tutto il traffico che termina in / user al server https: //.

    Quindi, nel tuo server 443, fai il contrario.

     server { listen 443; root /var/www/ location / { rewrite ^ http://$host$request_uri? permanent; } location /user { } } 

    Nginx consente di elaborare sia HTTP che HTTPS all'interno dello stesso block server . Quindi non è necessario duplicare le direttive per entrambi e può redirect il path che si desidera proteggere

     server { listen 80 default_server; listen 443 ssl; ... ssl certificate and other configs ... location /user { if ($scheme = 'http') { rewrite ^ https://$http_host$request_uri? permanent; } } ... your basic configuration ... } 

    Assicurarsi di non mettere ssl on linea perché interromperà la normale HTTP.

    Facoltativamente, è ansible redirect tutte le altre richieste da HTTPS indietro a HTTP allo stesso modo:

     if ($scheme = 'https') { rewrite ^ http://$http_host$request_uri? permanent; } 

    AGGIORNAMENTO : come sottolinea Alexey Ten nella sezione commenti, lo scheme controllo su each richiesta non è un'idea molto brillante. Dovresti seguire il modo dichiarativo di configurare la tua nginx. In questo caso, dichiarare due blocchi di server con i reindirizzamenti per location , spostare la logica comune in un file separato e inserirla in entrambi. Quindi la risposta di GruffTech è migliore.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.