Nginx 301将http(裸和www)重定向到https www,再将通配符子域重定向到https

时间:2018-07-01 19:23:01

标签: redirect nginx

我正在尝试为具有大量自定义域名的多租户Saas设置Nginx代理服务器。我想做的是创建一个服务器块,该服务器块可以处理以下所有请求,所有请求都永久为301:

  1. http://custom-domain.comhttps://www.custom-domain.com(custom-domain.com可以是任何用户设置的域名)

  2. http://www.custom-domain.comhttps://www.custom-domain.com(还是任何域名)

  3. http:// .saas-domain.com到https:// .saas-domain.com(saas-domain,com是我的服务的单个域名)< / p>

我目前正在使用一些If语句来处理此问题,但是它看起来很骇人,我希望以更有效的方式寻求帮助:

server {
    listen 80 default_server;

    location / {

      # if 'www' redirect to https
      if ($host ~* ^(www)) {
        return 301 https://$host$request_uri;
      }
      # if '*.saas-domain.com' redirect to https://*.saas-domain.com
      if ($host ~* ^(.*)\.saas-domain\.com) {
        return 301 https://$host$request_uri;
      }
      # if not 'www' redirect to https and add 'www'
      if ($host !~* ^(www)) {
        return 301 https://www.$host$1 permanent;
      }
    }
}

这是处理我所有情况的最佳方法吗?我认为复杂之处在于通配符自定义域。我担心If语句的开销。 TIA!

1 个答案:

答案 0 :(得分:0)

除非没有其他方法可以解决问题,否则Nginx建议不要使用“ If”语句。我建议为您的域名添加单独的块,因为这将为您提供更大的灵活性。

请尝试以下操作,看看是否有帮助。

# Capture requests that already have www and redirect to https

server {

    listen 80;
    server_name www.*;
    return 301 https://$server_name$request_uri;

}

# Captures the saas-domain.com requests and redirects them

server {

    listen 80 ;
    server_name *.saas-domain.com;
    return 301 https://$server_name$request_uri;

}

# Default capture everything else and redirect to https://www.

server {

    listen 80 default_server;
    server_name _;
    return 301 https://www.$host$request_uri;

}

首先在进行生产之前对其进行测试。

Nginx Server names

Nginx if is evil

Nginx variables

相关问题