【问题标题】:Nginx configure: if not iPhone/iPad then 301 redirect to httpsNginx 配置:如果不是 iPhone/iPad 则 301 重定向到 https
【发布时间】:2017-06-03 02:50:36
【问题描述】:

我通过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;
        }

========或==========

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

========或==========

但是两者都没有效果。

【问题讨论】:

    标签: ssl nginx https safari ssl-certificate


    【解决方案1】:

    前端重定向是一个更好的解决方案:

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

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

    当然,更好的解决方案可能是使用受信任的证书,例如 let's encrypt。

    【讨论】:

      【解决方案2】:

      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 指令可用于将任何通用配置卸载到单独的文件中(如上图所示)。

      【讨论】:

        猜你喜欢
        • 2019-08-13
        • 2017-09-15
        • 2019-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-23
        • 2013-10-03
        • 1970-01-01
        相关资源
        最近更新 更多