【问题标题】:Nginx - is it possible to redirect to different https servers based on the servername?Nginx - 是否可以根据服务器名重定向到不同的 https 服务器?
【发布时间】:2016-08-16 04:35:11
【问题描述】:

目前,我正在以这种方式重定向 http 请求:

server {
    listen 80;
    listen [::]:80 ipv6only=on;
    server_name emberhub.me www.emberhub.me test.emberhub.me;
    return 301 https://$host$request_uri;
}


# HTTPS server static html
#
server {
    listen 443 ssl;
    server_name emberhub.me www.emberhub.me;

    root html;
    index index.html index.htm;

    ssl on;
    ....
    location / {
            try_files $uri $uri/ =404;


# HTTPS server proxy Node.js app
#
server {
    listen 444 ssl;
    server_name test.emberhub.me;

    ssl on;
    ...
    location / {
        proxy_pass http://127.0.0.1:8080;

当用户请求时: http://emberhub.mehttp://www.emberhub.me ,他被正确重定向到 https://emberhub.mehttps://www.emberhub.me (在默认端口 443 上)

但是当用户请求时: http://test.emberhub.me ,他也被重定向到端口 443 并获取静态 html 页面,而不是 node.js 应用程序

如果用户使用端口 444 请求它 http://test.emberhub.me:444,那么他就被正确代理到了 node.js 应用了……

有没有办法根据 server_name 过滤请求并使用正确的 SSL 端口重定向它?还是有其他更好的方法来执行这些重定向?

感谢反馈

更新 1:

我尝试更改服务器声明,如下所示,但我仍然遇到同样的问题...http://test.emberhub.me,总是重定向到端口 443

server {
    listen 80;
    listen [::]:80 ipv6only=on;
    server_name emberhub.me;
    return 301 https://$host$request_uri;
}

server {
    listen 80;
#        listen [::]:80 ipv6only=on;
    server_name www.emberhub.me;
    return 301 https://$host:443$request_uri;
}

server {
    listen 80;
#        listen [::]:80 ipv6only=on;
    server_name test.emberhub.me;
    return 301 https://$host:444$request_uri;
}

更新 2

我将默认配置更新为

server {
    listen 80;
    listen [::]:80 ipv6only=on;
    server_name test.emberhub.me;
    return 301 https://$host:444$request_uri;
}

server {
    listen 80;
    listen [::]:80 ipv6only=on;
    server_name  emberhub.me  www.emberhub.me;
    return 301 https://$host$request_uri;
}

使用curl -v 一切正常...

 $ curl -v http://emberhub.me
 * Rebuilt URL to: http://emberhub.me/
 ...
 < Connection: keep-alive
 < Location: https://emberhub.me/
 ...
 Connection #0 to host emberhub.me left intact

$ curl -v http://www.emberhub.me
...
< Connection: keep-alive
< Location: https://www.emberhub.me/
Connection #0 to host www.emberhub.me left intact

curl -v http://test.emberhub.me
Rebuilt URL to: http://test.emberhub.me/
...
< Location: https://test.emberhub.me:444/
Connection #0 to host test.emberhub.me left intact

但是在浏览器中请求http://test.emberhub.me 在端口443 上显示https://test.emberhub.me ...

【问题讨论】:

  • 为每个域/站点单独配置,而不是将它们全部组合在一起,因为您有冲突的 server_name 指令,因此它会在第一个服务器块上捕获所有内容。所以为 emberhub.me 和 www.emberhub.me 做一个配置,因为它们实际上是相同的,并为 test.emberhub.me 做一个单独的配置我害怕。谷歌也为 ssl 正确配置 nginx 以使其安全。
  • 我试图分离配置但没有办法...
  • 对不起老话题。但问题可能是您的浏览器缓存与 ip 的指令混淆;)尝试使用隐身。

标签: nginx http-redirect


【解决方案1】:

如果您需要该服务器上的不同行为,请为其单独配置:

server {
  listen 80;
  server_name test.emberhub.me;
  return 301 https://$host:444$request_uri;
}

【讨论】:

  • 我明白,但是在这种情况下,我得到了一个重复的监听选项:在 /etc/nginx/sites-enabled/test 中为 [::]:80 重复监听选项
  • @erwin 您是否从第一台服务器中删除了域?你也可能不需要单独监听 ipv6
  • 您可以使用重复的监听指令拥有任意数量的 server {} 块。 Nginx 只会根据 server_name 评估它们以查看哪一个匹配。两个陷阱是: 不支持 SNI 的客户端上的 HTTPS(因此必须小心)。此外,如果您有某事在做,例如“listen 80”而另一个在做“listen 127.0.0.1:80”,则更具体的将获胜,并且仅在“listen 80”上监听的主机将不会在 localhost 上可见.
  • 我更新了服务器声明,当我将它卷曲时,它似乎很好,我得到了正确的返回(位置:emberhub.me,位置:emberhub.me,位置:test.emberhub.me:444)但是使用浏览器并不好...... 444 ssl 块中的 proxy_pass 127.0.0.1:8080 是否“糟糕”地做了一些奇怪的事情?
  • @erwin 这是因为您设置了 Strict-Transport-Security - 设置后,浏览器将在第二次访问时转到 443,忽略 80 端口,即使明确设置为 http://..:80
猜你喜欢
  • 2015-04-15
  • 2017-06-19
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多