Nginx网址重写不起作用

时间:2017-04-13 11:43:50

标签: nginx https url-rewriting

我希望将my.domain.de的所有请求重定向到my.domain.com,包括将 http 重写为 https 。 重定向仅适用于http://my.domain.de,它被重定向到https://my.domain.com,这是目标。 当我拨打https://my.domain.de时,它不会被重定向。 但是,当我尝试访问my.domain.comhttp://my.domain.com时,重定向到 https 方案失败。很奇怪,因为我在切换到.com域之前对my.domain.de使用了相同的重写规则,但它确实有效。

这是我的nginx.conf文件:

    # my.domain.de
    server {
            listen 80;
            server_name my.domain.de;
            return 301 https://my.domain.com$request_uri;
    }

    # my.domain.com
    server {
            listen 80;
            listen 443;
            ssl on;

            ssl_certificate /path/to/cert;
            ssl_certificate_key /path/to/key;

            server_name my.domain.com;

             # Url rewrite does not seem to work:
            if ($scheme = http) {
              return 301 https://$server_name$request_uri;
            }
    }

修改 以前我写过.de域中所有内容的重定向都可以。不幸的是,它只有在我输入http://my.domain.de或没有http://时才有效 当我使用https://my.domain.de时,由于证书无效,它会收到警告。所以my.domain.de的重写规则也有问题。

EDIT2: 现在我为my.domain.de重新安装了一个证书,所以我唯一知道的问题是http://my.domain.com没有被重定向到https。 编辑过nginx.conf:

  # my.domain.de
server {
        listen 80;
        listen 443 ssl;

        ssl_certificate /path/to/cert.de;
        ssl_certificate_key /path/to/key.de;

        server_name my.domain.de;
        return 301 https://my.domain.com$request_uri;
}

# my.domain.com
server {
        listen 80;
        listen 443 ssl;

        ssl_certificate /path/to/cert.com;
        ssl_certificate_key /path/to/key.com;

        server_name my.domain.com;

         # Url rewrite does not seem to work:
        if ($scheme = http) {
          return 301 https://$server_name$request_uri;
        }
}

2 个答案:

答案 0 :(得分:2)

您已为端口80和端口443启用了SSL。不推荐使用ssl on;,而是使用ssl指令的listen选项。

使用显式默认服务器作为“全能”,将非my.domain.com和任何http地址的所有内容重定向到https://my.domain.com

server {
    listen 80 default_server;
    listen 443 default_server ssl;

    ssl_certificate /path/to/domain.de/cert;
    ssl_certificate_key /path/to/domain.de/key;

    return 301 https://my.domain.com$request_uri;
}

server {
    listen 443 ssl;
    server_name my.domain.com;

    ssl_certificate /path/to/domain.com/cert;
    ssl_certificate_key /path/to/domain.com/key;

    ...
}

请注意,一个服务器块使用旧证书,一个服务器块使用新证书。

有关详情,请参阅this document

答案 1 :(得分:0)

由于重写对我不起作用而且由于机器上的其他服务器而无法设置默认服务器块,我终于通过添加两个服务器解决了这个问题,一个用于端口80,另一个用于端口443。 .domain.com。我现在不知道这是可能的。所以这是我的新nginx.conf:

  # my.domain.de
  server {
    listen 80;
    listen 443 ssl;
    ssl_certificate /path/to/cert.de;
    ssl_certificate_key /path/to/key.de;
    server_name my.domain.de;
    return 301 https://my.domain.com$request_uri;
  }

  # my.domain.com http
  server {
    listen 80;
    server_name my.domain.com;
    return 301 https://my.domain.com$request_uri;
   }

   # my.domain.com https
   server {
    listen 443 ssl;
    ssl_certificate /path/to/cert.com;
    ssl_certificate_key /path/to/key.com;
    server_name my.domain.com;
  }