【问题标题】:Redirecting base domain to HTTPS, and sub-domains to HTTP将基域重定向到 HTTPS,将子域重定向到 HTTP
【发布时间】:2014-04-01 08:39:07
【问题描述】:

我一直在为一个项目使用 Apache,由于项目已经发展了很多,现在出于性能原因决定转换为 nginx。

对于这个项目,我们通过 HTTPS 为我们的基本域和 www 子域提供服务,但需要通过 HTTP 为所有其他子域提供服务。

在 Apache 中,我能够通过 RewriteEngine 执行以下操作来完成此操作:

RewriteEngine On

#Redirect domain and www to HTTPS
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} =mydomain.com [OR]
RewriteCond %{HTTP_HOST} =www.mydomain.com
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

#Redirect wildcard subdomains to HTTP
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^(.+)\.mydomain\.com [NC]
RewriteCond %{HTTP_HOST} !=www.mydomain.com
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

我的网站大约使用 nginx 设置了一半,而这部分配置让我很难过。如何将其转换为与 nginx 一起使用?

【问题讨论】:

    标签: apache nginx url-rewriting


    【解决方案1】:

    我将答案分为 4 个虚拟主机。前两个解决了主要域之间的 http 到 https 重定向。第二部分捕获子域并从 https 重定向到 http:

    # FIRST PART ---------------
    # from http to https on main domains                 
    server {                                             
      listen 80;                                         
      server_name domain www.domain;                     
    
      location / {                                       
        return 301 https://$host$request_uri;            
      }                                                  
    }                                                    
    
    server {
      listen 443 ssl;
      server_name domain www.domain;
    
      # blah, blah, https and virtualhost configuration                  
    }                                                    
    
    
    
    # SECOND PART ---------------
    # from https to http and others subdomains           
    server {                                             
      listen 443 ssl;                                    
      server_name *.domain;                              
    
      # blah, blah, https configuration                  
      location / {                                       
        return 301 http://$host$request_uri              
      }                                                  
    }                                                    
    
    server {                                             
      listen 80;                                         
      server *.domain;                                    
      # virtual with http configuration                  
    }
    

    【讨论】:

    • 我将在哪里使用此解决方案实现 www 到非 www 重定向?
    • 另外,您的解决方案是将所有内容从 http 重定向到 https。所有通配符子域都被发送到 SSL。
    • 在您的问题中,您要求通过 SSL 处理 www 而不是 www。据我所知,www.domain 和 domain 应该由处理 SSL(第一部分)。
    • 在您的问题中,您要求通过 SSL 处理 www 而不是 www。据我了解,www.domain 和 domain 应该由处理 SSL(第一部分)。第一个虚拟主机将所有 http(www.domain 或 domain)重定向到第二个虚拟主机(www.domain 或 domain)上的 https。第三个虚拟主机被声明为将所有 SSL 重定向到 http,它除了重定向到第四个虚拟主机之外什么都不做。 “服务器 *.domain” 不匹配每个子域。 “www.domain”在第一个和第二个声明。 "server *.domain" 作为剩余匹配项的 "catch all" 虚拟主机。
    猜你喜欢
    • 2016-01-30
    • 2015-05-19
    • 2015-08-26
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2019-03-03
    相关资源
    最近更新 更多