2017-01-18 6 views
2

Ich aktualisiere meine Website auf https mit startssl Zertifizierung. Aber Safari misstraut der StartS-Zertifizierung. Also, ich setze das nginx, wenn es http ist, und der UserAgent enthält kein iPhone/iPad, dann 301 umleiten zu https. (Es ist gemein, anderer Browser wird 301 zu https.) Das ist mein versucht:Nginx configure: wenn nicht iPhone/iPad dann 301 auf https umleiten

server { 
     listen  80; 
     listen  443 ssl; 
     server_name abc.com alias abc.com; 
     ssl_certificate  D:\cert\1_abc.com_bundle.crt; 
     ssl_certificate_key D:\cert\abc.com.key; 
     ssl_session_timeout 5m; 
     ssl_protocols SSLv2 SSLv3 TLSv1; 
     ssl_ciphers HIGH:!aNULL:!MD5; 
     ssl_prefer_server_ciphers on; 
     if ($scheme = http) && if ($http_user_agent !~* iPhone|iPad) { 
      return 301 https://$host$request_uri; 
     } 
     location/{ 
      root   D:/www; 
      index index.html index.htm default.html default.htm index.php; 
      include  D:/www/up-*.conf; 
     } 

======== OR ==========

if ($scheme = http && $http_user_agent !~* iPhone|iPad) 

======== OR ==========

Aber beide von ihnen, keine Wirkung.

Antwort

0

Die if Direktive kann nur einfache Bedingungen enthalten. Details finden Sie unter this document.

Ein Ansatz wäre, die Server http und https in separate server Blöcke zu trennen.

server { 
    listen  80; 
    server_name abc.com alias abc.com; 

    if ($http_user_agent !~* "iPhone|iPad") { 
     return 301 https://$host$request_uri; 
    } 

    include path/to/common/config; 
} 

server { 
    listen  443 ssl; 
    server_name abc.com alias abc.com; 
    ssl_certificate  D:\cert\1_abc.com_bundle.crt; 
    ssl_certificate_key D:\cert\abc.com.key; 
    ssl_session_timeout 5m; 
    ssl_protocols SSLv2 SSLv3 TLSv1; 
    ssl_ciphers HIGH:!aNULL:!MD5; 
    ssl_prefer_server_ciphers on; 

    include path/to/common/config; 
} 

Es beinhaltet nicht dupliziert gemeinsame Konfiguration über beiden server Blöcke jedoch die include Richtlinie zur Verfügung jeder gemeinsame Konfiguration in eine separate Datei abzuladen (wie oben dargestellt).

0

Eine bessere Lösung für Ihr Problem wird eine Front-End-Umleitung sein:

Im HTTP-Web-Seite, gehört eine js Datei auf der https Version, die nur eine Sache zu tun: Umleitung auf die gleiche URL aber mit https. Daher werden nur Clients weitergeleitet, die Ihren Zertifikaten vertrauen.

Aber was auch immer die Lösung, wenn die Benutzer einen https-Link erhalten, wird es gebrochen, wenn sie das Zertifikat nicht vertrauen. Und ich hoffe, dass Sie mit keinen persönlichen Daten umgehen, denn Sie haben eine Schutzpflicht auch für iPads.

Aber natürlich könnte eine bessere Lösung sein, ein vertrauenswürdiges Zertifikat zu verwenden, von uns zum Beispiel zu verschlüsseln.

Verwandte Themen