域名能访问而直接使用IP显示404,通常由以下几种原因导致:
1. 基于域名的虚拟主机(HTTP Host头绑定)
原理:同一IP可能托管多个网站(如多个域名共享服务器资源),服务器通过请求头中的
Host
字段区分不同域名。问题:直接访问IP时,请求头中没有
Host
字段,或Host
值为IP而非域名,服务器无法确定要返回哪个网站内容。验证方法:
用浏览器插件(如Postman)手动添加
Host: your-domain.com
的请求头访问IP,观察是否正常显示。
解决方案:
Apache:配置默认虚拟主机(
<VirtualHost *:80>
)处理无匹配域名的请求。Nginx:设置默认
server
块(listen 80 default_server
)定义IP访问的响应(如返回404或重定向)。
2. CDN/反向代理的域名绑定
原理:CDN或反向代理(如Cloudflare、Nginx)可能要求请求必须携带原始域名才能正确回源。
问题:直接访问IP时,请求未通过CDN/代理的域名校验,导致拒绝响应或返回错误。
验证方法:
检查是否使用了CDN(如通过
nslookup
查看解析的IP是否为CDN节点)。在服务器本地用
curl -H "Host: your-domain.com" http://localhost
测试能否正常返回内容。
解决方案:
禁止直接通过IP访问(如配置防火墙规则或返回403/404)。
在反向代理配置中绑定IP请求的默认处理逻辑。
3. 安全策略限制
原理:服务器或防火墙可能出于安全考虑,禁止通过IP直接访问(防止SSRF攻击或恶意扫描)。
常见配置:
Web服务器(如Nginx)设置
if ($host != "your-domain.com") { return 444; }
。云服务商(如阿里云)的安全组规则限制IP访问。
解决方案:
修改安全策略,允许IP访问(不推荐,可能降低安全性)。
保持现状,仅通过域名访问。
4. 应用层路由依赖域名
原理:某些Web框架(如Django、Spring Boot)会根据域名匹配路由规则,IP访问时无法命中有效路由。
验证方法:
检查应用日志,查看IP访问时是否触发404路由(如Spring的
No mapping for GET /
)。
解决方案:
调整应用的路由配置,支持通过IP访问(需谨慎,可能影响安全性和功能)。
通过反向代理强制域名访问(推荐)。
5. HTTPS证书限制
原理:若网站启用HTTPS,但SSL证书仅绑定域名(如Let's Encrypt证书),直接通过IP访问会触发证书错误,服务器可能主动拒绝连接。
现象:
浏览器提示
NET::ERR_CERT_COMMON_NAME_INVALID
(证书与IP不匹配)。服务器因证书无效返回404或其他错误。
解决方案:
申请支持IP的SSL证书(如付费证书)。
禁止IP访问HTTPS服务。
排查步骤总结
检查Host头:用工具(如curl)模拟带Host
头的IP访问,确认是否正常。
curl -H "Host: your-domain.com" http://服务器IP
查看服务器配置:确认虚拟主机或反向代理是否绑定域名。
检查防火墙/CDN:确认是否有安全策略拦截IP请求。
查看应用日志:确认404是来自服务器还是应用层。
最终建议
生产环境:保持通过域名访问,禁止直接IP访问以提升安全性和可控性。
测试环境:可临时配置默认虚拟主机,允许IP访问调试。