html - 在 Nginx 中构建多个项目的最佳实践?
问题描述
首先,我要为我的标题含糊而道歉。我在创建 Nginx 配置时确实遇到了一个特定问题,但这是我遇到过多次的问题,我很难相信没有更好的方法。我选择了一个模糊的标题,因为我觉得我无法用这么少的文字来描述这个问题,并且因为我想概括它以希望得到更好的答案。
这是我的问题-
假设我有一个 Nginx 服务器example.com
,在我的配置文件中我的服务器根设置为/directory/files
. 我设置了一个位置,我们称之为/website
。我从example.com/website
. 服务器返回我的网页,在这个网页上,我链接到/js/myfile.js
脚本标签中的位置。这就是我的问题出现的地方。
example.com
因此浏览器向该位置发送一个带有主机的请求/js/myfile.js
。我的服务器看到了请求,但没有找到 的位置块/js/myfile.js
,因此它发回状态 404。
好的,找到问题了——我从 提供我的 HTML /directory/files/website
,但我不能提供服务/directory/files/js/myfile.js
,因为它确实不存在(至少不在那个位置)。相反,我的 JS 位于其中,/directory/files/website/js
因为项目文件通常单独存储在它们自己的目录中以进行组织。
总而言之,我的网站尝试提供来自服务器根目录的链接中的相对位置,这不起作用,因为带有链接的 HTML 提供的目录比根目录更深。我最终遇到了一种情况,我总是在我的位置缺少目录级别。
当然,我可以通过添加location /js {root /directory/files/website;}
到我的配置文件中来硬编码给定网站的 JS、CSS 和媒体的位置,但是这个解决方案不能扩展到不同位置网站、网站 2、网站 3 等的多个托管页面.
我疯了吗?其他人是否遇到过这种情况?我使用 Nginx 错了吗?我该如何解决这个问题?如果我的浏览器知道从哪个目录请求页面,为什么相对链接仍被视为相对于服务器根目录,而不是页面来自的目录???
解决方案
您的链接不是相对的 - 它们是绝对的。任何以正斜杠开头的链接都被认为是绝对链接,例如/js/myfile.js
.
如果您想避免当前的“混乱” - 您只需要在所有 HTML 文件中使用相对链接,除非它们引用外部网站(例如 CDN)。
删除前导斜杠(如果您的 JS 文件夹与 HTML 文件处于同一级别) - 或者..
如果您的 JS 文件夹位于 HTML 文件的上一层,则在链接前添加一个。
推荐阅读
- java - JPA 在插入/更新时返回完整的外键实体
- python - 使用键数组根据第一个元素按顺序拉取元素
- vue.js - Vuex getter 返回 null
- postgresql - 修复错误:“运算符不存在:没有时区的时间戳>整数”错误
- angular - 管道间隔可观察并作为输入传递,因为异步管道未在模板中呈现
- node.js - 使用 MariaDB 数据库在 Node 中使用 Sequelize 查询不区分大小写
- vue.js - vuejs 在 URL 中总是添加 #
- javascript - 如何在页面加载中初始化 ReactWOW
- javascript - 在使用 i18n.use(LanguageDetector).init() 之前等待来自 api 的每次语言更改的资源数据
- c# - 使用特定日期填充 jQuery Datepicker