nginx 1.8 重写错误或配置不当

nginx 1.8 重写错误或配置不当

我有 2 个 nginx 的 conf 文件,ssl.conf位于default.conf/etc/nginx/conf.d/。第一个文件处理传入的 http 请求。它将 http 请求重写为 https。该ssl.conf文件处理基于 https 的请求。

下面是default.conf它的样子

server {
    listen       80 default_server;
    server_name  abc.example.com 123-abc.example.com;

    port_in_redirect off;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


    set_real_ip_from 127.0.0.1;
    set_real_ip_from 10.0.0.0/8;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;   

    location /about {
      root /usr/share/nginx/html;
      add_header X-Frame-Options "DENY";
      try_files $uri /about.html;
    }

    location /webapi {
      add_header X-Frame-Options "DENY";
    }

    location / {
      rewrite        ^ https://$server_name$request_uri? permanent;
    }
}

这里的问题是, abc.example.com/to/some/path重写为https://abc.example.com/to/some/path这是预期的结果。

123-abc.example.com/to/some/path也重写为https://abc.example.com/to/some/path而不是https://123-abc.example.com/to/some/path

我尝试通过设置 2 个不同的 server_name 作为别名来获得 2 个以相同方式工作的 URL。它们并非设计用于服务不同的页面/网站。

答案1

以下是您的重写内容:

      rewrite        ^ https://$server_name$request_uri? permanent;

问题在于您使用了$server_name,它不是浏览器请求的 HTTP 主机名,而是块server_name中定义的第一个主机名server

要解决此问题,请将其更改为$http_host,即浏览器请求的主机名。

      rewrite        ^ https://$http_host$request_uri? permanent;

更好的办法是根本不要用rewrite。 就足够了return 301

      return 301 https://$http_host$request_uri$is_args$args;

相关内容