nginx return命令返回没有www的https url

时间:2017-03-15 20:26:23

标签: url redirect nginx

我正在尝试设置nginx以返回所有http请求的https网址。 问题是,它返回没有www的https url导致无效的URL。

这是我的配置:

server {  
  listen 80;  server_name my_server;
  return 301 https://$server_name$request_uri;
}

server {  
   listen   443;  
   ssl    on;
   ssl_certificate    /etc/ssl/my_pem.pem;
   ssl_certificate_key    /etc/ssl/my_key.key;  
   server_name my_server;    

   access_log /var/log/nginx/my_log.access.log;

   ...
}

我尝试在server_name中包含www,并为301返回指定带有www的显式网址。

所有内容都会导致网址无效。

我注意到,当我登录应用程序时,我将https更改为http并触发请求重定向工作。当我退出时,重定向失败并呈现没有www。

的https网址

然后我尝试只使用server_name,如下所示:return 301 https:// $ server_name但是也没有用。

我想让用户不必担心他们指定的网址。网址如下所示:www.one.two-three.com

<<<编辑>>>

这有效:http://www.one.two-three.com/some_request

并且不会:http://www.one.two-three.com

<<<编辑>>>

<<<编辑1>>>

在Chrome / Chromium的网址行输入www.one.two-three.com,它会重定向到https://www.one.two-three.com

在Firefox中,它返回https://one.two-three.com

<<<编辑1>>>

有人可以帮忙吗?

谢谢。

西巴

1 个答案:

答案 0 :(得分:0)

我用来解决这个问题的模式有2个部分。首先,我设置了显式重定向,从HTTP到正确的HTTPS URL,以及从裸HTTP到" www" HTTPS。其次,这意味着我可能不会依赖$server_name,因此我的配置中有一些可维护的重复。

server {
  listen      80;
  server_name www.example.com example.com example.biz example.us www.example.biz www.example.us;
  return      301     https://www.example.com$request_uri;
}

server {
  listen      443;
  server_name example.com example.biz example.us www.example.biz www.example.us;

  ssl on;
  ssl_certificate /etc/ssl/com.example.crt;
  ssl_certificate_key /etc/ssl/com.example.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers RC4:HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers on;

  return      301     https://www.example.com$request_uri;
}

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