辰辰
辰辰
Published on 2025-03-11 / 16 Visits
0
0

DS:域名能访问而直接使用IP显示404

域名能访问而直接使用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

  1. 查看服务器配置:确认虚拟主机或反向代理是否绑定域名。

  2. 检查防火墙/CDN:确认是否有安全策略拦截IP请求。

  3. 查看应用日志:确认404是来自服务器还是应用层。


最终建议

  • 生产环境:保持通过域名访问,禁止直接IP访问以提升安全性和可控性。

  • 测试环境:可临时配置默认虚拟主机,允许IP访问调试。


Comment