我有 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;