Nginx中www域名跳转至主域名失效问题求助
1. 先确保配置生效
首先验证配置语法是否正确,避免因语法错误导致配置未加载:
nginx -t
如果提示配置正常,立即重载Nginx:
nginx -s reload
注意你配置里的********占位符(比如uwsgi_pass路径、include的uwsgi_params文件路径)必须是有效路径,否则整个server块可能无法正常加载。
2. 检查默认Server的抢占问题
Nginx会优先匹配带有default_server标记的server块。如果你的服务器上还保留着Nginx默认配置(比如/etc/nginx/sites-enabled/default),里面的server块大概率设置了listen 80 default_server,这会导致www.mydomain.com的请求被默认页server接住,而非你写的跳转规则。
解决思路:
- 方案一:给你的跳转server块加上
default_server标记,强制匹配:
server { listen 80 default_server; server_name www.mydomain.com; return 301 $scheme://mydomain.com$request_uri; }
- 方案二:直接禁用默认配置,删除默认配置的软链接:
rm /etc/nginx/sites-enabled/default nginx -s reload
3. 确认DNS解析一致性
用nslookup或dig检查www子域名的解析IP是否和主域名一致:
nslookup www.mydomain.com nslookup mydomain.com
如果两者IP不同,说明DNS配置错误,需要修改域名解析的A记录,让www.mydomain.com指向正确的服务器IP。
4. 排查配置加载顺序
Nginx加载sites-enabled目录下的配置时,会按文件名排序匹配。如果你的自定义配置文件名(比如mydomain.conf)在默认配置(default)之后,默认配置的server块会优先匹配请求。
解决方法:要么修改自定义配置文件名让它排在前面(比如00-mydomain.conf),要么直接删除默认配置。
5. 用日志验证请求匹配
在跳转server块里添加访问日志,确认请求是否到达该块:
server { listen 80; server_name www.mydomain.com; access_log /var/log/nginx/www_redirect.log; return 301 $scheme://mydomain.com$request_uri; }
重载Nginx后访问www.mydomain.com,查看日志文件/var/log/nginx/www_redirect.log。如果没有日志记录,说明请求根本没匹配到这个server块,回到前面的步骤重新排查。
内容的提问来源于stack exchange,提问作者SAVEPALASTINE

