Nginx配置:如果不是iPhone / iPad,则301重定向到https

时间:2017-01-18 16:17:30

标签: ssl nginx https safari ssl-certificate

我使用startssl认证将我的网站升级到https。 但Safari不信任startssl认证。 所以,我考虑设置nginx,如果它是http,而UserAgent不包含iPhone / iPad,那么301重定向到https。(这意味着,其他浏览器将301到https。) 这是我的尝试:

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

但是他们两个都没有效果。

2 个答案:

答案 0 :(得分:0)

if指令只能包含简单的条件。有关详细信息,请参阅this document

一种方法是将httphttps服务器分隔为单独的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;
}

它确实涉及在server块中复制通用配置,但是,include指令可用于将任何常见配置卸载到单独的文件中(如上所示)。

答案 1 :(得分:0)

针对您的问题的更好解决方案将是前端重定向:

在http网页中,包含位于 https 版本上的js文件,这些文件只做一件事:重定向到相同的网址但使用https。因此,只有信任您的证书的客户才会被重定向。

但无论解决方案如何,如果用户获得https链接,如果他们不信任证书,它将被破坏。我希望你不处理任何个人数据,因为你有义务保护这些数据,即使对于那些使用iPad的人也是如此。

但是,当然,更好的解决方案可能是使用受信任的证书,例如来自let的加密。