nginx子域ssl重定向重定向顶级域

时间:2013-12-24 22:53:02

标签: nginx

我为子域上的所有HTTP流量设置了重定向以通过HTTPS,但我注意到当我访问http://mydomain.com时,它会重定向到https://subdomain.mydomain.comhttps://mydomain.com没有遇到任何问题。

只是澄清一下,

http://mydomain.com不应重定向,但目前会重定向到https://subdomain.mydomain.com

http://subdomain.mydomain.com应重定向到https://subdomain.mydomain.com

这是我的nginx conf

server {
    listen *:80;
    server_name subdomain.mydomain.com;
    server_tokens off;
    root /nowhere; # this doesn't have to be a valid path since we are redirecting, you don't have to change it.
    rewrite ^ https://$server_name$request_uri permanent;
}

server {
    listen 443 ssl;
    server_name subdomain.mydomain.com;
    server_tokens off;
    .... other stuff ...
}

1 个答案:

答案 0 :(得分:1)

引自http://nginx.org/en/docs/http/request_processing.html

  

nginx首先决定哪个服务器应该处理请求。让我们   从简单的配置开始,所有三个虚拟服务器   听口*:80:

server {
    listen      80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      80;
    server_name example.com www.example.com;
    ...
}
  

在此配置中,nginx仅测试请求的标头字段   “主机”确定应将请求路由到哪个服务器。如果   它的值与任何服务器名称都不匹配,或者请求不匹配   根本包含此标头字段,然后nginx将请求路由到   此端口的默认服务器。在上面的配置中,   默认服务器是第一个 - 这是nginx的标准默认值   行为。

这意味着在您的示例中,当您向http://mydomain.com发出请求时,唯一可用的服务器块是server_name subdomain.mydomain.com;块,因此它会重定向到https。最简单的解决方案是创建一个新的服务器块,它只返回一个http状态代码,可能还有一条消息。 E.g。

server {
  listen 80;
  server_name mydomain.com;
  return 403 "nothing to see here";
}

您也可以使用此default_server之类的listen 80 default_server;来确保所有“未配置的”主机名都会出现在此块中