URL 重写规则和静态资源解析逻辑

问题背景

最近部署博客页面时遇到这样的问题:同样的页面结构,部署到我的两个域名下:dodolalorc.cn 和 dodolalorc.github.io,对应的网页内容是相同的,但是 dodolalorc.cn 需要写成https://dodolalorc.cn/links.html才能显示内容,否则会报404,dodolalorc.github.io就不需要这样。

原因记录

这种差异主要源于两个域名所对应的服务器配置不同,本质原因是服务器如何解析 "无后缀 URL"。

我的 dodolalorc.cn 配置在服务器上,而 dodolalorc.github.io 将走 github page 的代理。

当访问一个 URL(如a.github.io/about或a.cn/about)时,服务器需要判断这个请求对应的实际文件是什么。

  • 对于a.github.io/about:服务器被配置为 "自动补全.html后缀",即自动将about解析为about.html,因此能找到对应的文件并返回内容。
  • 对于a.cn/about:服务器没有配置自动补全后缀 ,它会严格按照请求的路径查找文件(即寻找about这个 "无后缀文件"),但实际文件是about.html,因此找不到,返回 404;只有手动加上.html(即a.cn/about.html),才能匹配到实际文件。

a.github.io通常是托管在GitHub Pages上的静态网站,而 GitHub Pages 默认配置了 "友好 URL 规则",会自动处理无后缀的 URL 请求。具体逻辑包括:

  • 自动补全.html后缀 :当请求/about时,服务器会先检查是否存在about.html文件,若存在则直接返回。
  • 支持目录索引 :如果about是一个文件夹,服务器会自动查找about/index.html(即默认索引文件)。

这种配置是 GitHub Pages 为了简化静态网站访问而预设的,目的是让 URL 更简洁(如xxx/about比xxx/about.html更易读)。

a.cn对应的服务器没有配置 "自动补全.html" 的规则,因此遵循 "严格匹配" 逻辑:

  • 当请求a.cn/about时,服务器会直接查找名为about的 "无后缀文件"(而非about.html)。
  • 由于实际文件是about.html(而非about),服务器找不到对应资源,就会返回 404 错误。
  • 只有手动指定完整文件名about.html,才能匹配到实际文件,因此a.cn/about.html能正常访问。

解决方法

我的服务器使用 Nginx 服务器,于是选择在 Nginx 的站点配置中添加:

nginx 复制代码
location / {
    # 当请求的文件不存在时,尝试补全.html
    if (!-e $request_filename) {
        rewrite ^(.*)$ $1.html last;
    }
}

配置后,a.cn/about会被自动解析为a.cn/about.html,无需手动加后缀。

相关推荐
赛博守夜人10 分钟前
AI安全攻防与治理之十四:AI 安全测试不能脱离传统安全,Web、API、移动端与模型攻击面的组合拳
前端·人工智能·安全
开开心心_Every11 分钟前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
networknomad35 分钟前
OpenReplay:自己搭的会话回放工具,给前端排错用的
前端·其他
缓慢更新1 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
陈随易2 小时前
AI 运维服务器,安全又可靠的方法
前端·后端·程序员
风骏时光牛马3 小时前
AI稳定性治理体系构建与疑难问题深度分析
前端
IT_陈寒3 小时前
JavaScript的this坑人实录,这次我真的记下来了
前端·人工智能·后端
开开心心就好4 小时前
音频降噪剪辑工具,音量裁剪一键处理
运维·服务器·前端·spring·ocr·音视频·1024程序员节
PedroQue996 小时前
0.8.2 新增 backFallback 配置,无 tabbar 页返回无忧
前端·uni-app
淡漠的蓝精灵6 小时前
web.py:一个简单到极致的 Python Web 框架
开发语言·前端·python·其他