为什么子域将请求重定向回父域?
Why does the subdomain redirect requests back to parent domain?
我有一个子域 sub.example.com,它指向托管在 EC2 实例上的 Web 服务器。
- 在 AWS Route53 控制台中,我创建了一个指向该实例的 public EIP 的 A 记录。
- 我用
nslookup
检查了 DNS 记录,它们看起来没问题。
- 我可以使用 public IP 地址从浏览器访问子域 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)都可能缓存来自旧配置的响应。使用浏览器的隐身模式或
curl
和 no-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 的回复。
我有一个子域 sub.example.com,它指向托管在 EC2 实例上的 Web 服务器。
- 在 AWS Route53 控制台中,我创建了一个指向该实例的 public EIP 的 A 记录。
- 我用
nslookup
检查了 DNS 记录,它们看起来没问题。 - 我可以使用 public IP 地址从浏览器访问子域 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)都可能缓存来自旧配置的响应。使用浏览器的隐身模式或
curl
和no-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 的回复。