为什么子域将请求重定向回父域?

Why does the subdomain redirect requests back to parent domain?

我有一个子域 sub.example.com,它指向托管在 EC2 实例上的 Web 服务器。

但是如果我尝试使用域名访问,浏览器会将请求重定向到父域:http://sub.example.com -> http://example.com。我使用 Nginx 作为反向代理,使用 NodeJs 作为后端服务器。

我需要做什么才能让它发挥作用?

编辑
如果我使用 www,我可以访问它。前缀(www.sub.example.com)。但是如果没有“www”,浏览器只会将我重定向到父域..

nginx.conf

user nginx;

worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

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

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

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

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        # Redirect all HTTP request to the node.js
        location / {
            proxy_redirect off;
            proxy_pass "http://127.0.0.1:5000";
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }
    }
}
  • 在 Route53 中创建两个类型为“A”的 DNS 记录(xxx.yyy.zzz.aaa 是您的 EC2 实例的 public IP 地址,例如 18.185.121.30):
sub.example.com -> xxx.yyy.zzz.aaa
www.sub.example.com -> xxx.yyy.zzz.aaa
  • 使用标准 nginx 配置(不要在 server_name 中指定任何 DNS 名称 - 使用默认值,即 server_name _;):
user nginx;

worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

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

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

    server {
        listen 80;
        server_name _;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        # Redirect all HTTP request to the node.js
        location / {
            proxy_redirect off;
            proxy_pass "http://127.0.0.1:5000";
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }
    }
}
  • 客户端(浏览器)和服务器(nginx)都可能缓存来自旧配置的响应。使用浏览器的隐身模式或 curlno-cache header 来测试:
curl -I -H "Cache-Control: no-cache" http://sub.example.com
  • 耐心点。 DNS 记录需要一些时间(生存时间或 TTL)在全球范围内传播。您可以减少 Route53 中的 TTL 并减少等待。

  • 要调试 DNS 问题,请使用此 Linux 命令:

dig -t a sub.example.com

我也喜欢 this web-service,它可以帮助您在全球范围内跟踪 DNS 传播。


更新:这是示例 node.js Web 服务器,我 运行 在端口 5000 上:

var http = require('http');

var server = http.createServer(function (req, res) {
  if (req.url == '/') {
    res.writeHead(200, { 'Content-Type': 'text/html' });
    res.write('<html><body><p>This is home Page.</p></body></html>');
    res.end();
  }
});

server.listen(5000);
console.log('Node.js web server at port 5000 is running..')

问题出在 dns 解析器缓存中。它缓存了指向旧 IP 的过时 A 记录。更新 dns 缓存后,问题就消失了。

感谢@maslick 的回复。