【问题标题】:nginx return command returns https url without wwwnginx return 命令返回不带 www 的 https url
【发布时间】:2017-08-06 19:08:40
【问题描述】:

我正在尝试设置 nginx 以返回所有 http 请求的 https url。 问题是,它返回的 https url 没有 www 导致无效的 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 的显式 url。

一切都导致无效的网址。

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

然后我尝试只使用 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

>>


>>

通过在 Chrome/Chromium 的 URL 行中键入 www.one.two-three.com,它会重定向到 https://www.one.two-three.com

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

>>


有人可以帮忙吗?

谢谢。

塞巴

【问题讨论】:

  • 清理浏览器缓存,因为 301 是可缓存重定向。你可能会得到越野车。使用例如 303 进行测试。
  • 工作就像一个魅力:) 谢谢!

标签: url redirect nginx


【解决方案1】:

我用来解决这个问题的模式有 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;
  ...
}

【讨论】:

  • 我已经尝试了上面的设置,重新加载 nginx conf 时出现此错误:在 0.0.0.0:443 上冲突服务器名称“www.mysite.com”,忽略浏览器返回无效重定向错误信息。
  • 在这种情况下子域重要吗?我的具体示例是 www.one.two-three.com,其中“一”是子域。
  • 您的第一个关于端口 443 上的服务器名称冲突的错误可能是由于将服务器名称列表复制到了错误的服务器部分。
  • 域/子域必须位于正确的位置。首先从我的示例中的第三个服务器部分开始 - 这是您的“真实”服务器配置,也是您在端口 443 上侦听www.one.two-three.com 的唯一位置。接下来设置第二个服务器部分(从端口 443 重定向)并在那里添加one.two-three.com。最后,设置第一个服务器部分(从端口 80 重定向)并在那里添加两个域名。
猜你喜欢
  • 1970-01-01
  • 2014-03-23
  • 2015-02-13
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
相关资源
最近更新 更多