2017-01-18 18 views
2

私はstartssl認証でhttpsに私のウェブサイトをアップグレードします。 しかし、サファリは、startssl認定を不信にしています。 これはhttpで、UserAgentにiPhone/iPadがない場合、nginxをhttpsにリダイレクトすることを検討します(つまり、他のブラウザは301からhttpsになります)。 これは私が試したものです:Nginxの設定:iPhone/iPadでない場合、301へのリダイレクト

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 ==========

しかし、どちらも効果はありません。

答えて

0

ifには、単純な条件文しか含めることができません。詳細は、this documentを参照してください。

1つの方法は、httphttpsサーバーを別々のserverブロックに分けることです。 (上記示されるように)それが両方serverブロックにわたって共通の構成を複製伴わない

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; 
} 

しかし、include指令は別のファイルに任意の一般的な構成をオフロードするために利用可能です。同じURLにリダイレクト:ただ一つのことだけを行うHTTPSバージョン上にあるJSファイルが含まれ、HTTPのWebページで

0

あなたの問題のためのよりよい解決策は、フロントエンドリダイレクトされますしかしhttpsで。したがって、証明書を信頼するクライアントだけがリダイレクトされます。

解決策が何であれ、ユーザーがhttpsリンクを取得した場合、証明書を信頼しないと壊れてしまいます。また、あなたが個人的なデータを扱わないことを願っています。なぜなら、あなたがiPadsを持っている人でさえこれらの保護の義務を負うからです。

もちろん、より良い解決策は、たとえば暗号化からの信頼できる証明書を使用することです。

関連する問題