html - 如何使用路由器路径作为根拥有 Express.js 服务器文件?
问题描述
我有这样的目录结构
root
private
js
css
index.html
app.js
privateRouter.js
...
在我的 index.html 中,我使用这样的相对路径引用了 js 和 css 文件:
<link rel="stylesheet" href="css/index.css"/>
<script src="js/index.js"></script>
在服务器端,我有一个私有路由器在提供这些文件之前检查身份验证:
在 app.js 中:
app.use("/private", privateRouter);
在 privateRouter.js 中:
router.use((req, res, next) => {
isAuthenticated(req) ? next() : res.redirect("/");
});
router.get('/', function(req, res, next) {
res.sendFile(require('path').join(__dirname + "/private/index.html"));
});
所以现在如果我访问http://mywebsite.com/private
我会得到 index.html,但是来自浏览器的 js/css 文件请求返回到服务器http://mywebsite.com/js
而不是http://mywebsite.com/private/js
,因此返回文件未找到。
或者,如果我静态提供文件,浏览器知道从以下位置请求/private/js
:
app.use("/private", express.static(path.join(__dirname, 'private')));
但我不能静态服务器,因为我需要对特定文件进行身份验证,而不是公开提供所有文件。而且我不想private/
在客户端的所有文件引用之前附加。我不明白为什么在静态服务时服务器知道以/private
root 身份使用,但在使用路由器时它/
以 root 身份使用。
如何保留 url,http://mywebsite.com/private
而不必private/
在客户端的所有文件引用中附加?
我是 express.js 的新手,我也很难提出这个问题。我认为我从根本上误解了 express.js 的工作原理。谢谢你的帮助!
解决方案
您可以使用中间件修改请求的 URL 以进行内部路由:
app.use((req,res,next)=>{
req.url = "/private" + req.url; // prepend "/private" to the url
next();
});
您还可以使用base标记设置基本 URL,这意味着您只需为每个页面指定一次基本 URL。
<html>
<head>
<base href="private">
<link rel="stylesheet" href="css/index.css"/>
<script src="js/index.js"></script>
</head>
</html>
这应该将请求发送到:
/private/css/index.css
/private/js/index.js
但是,您仍然需要代码来处理这些路径,否则,您仍然会收到 404 not found 错误。
推荐阅读
- install4j - 重定向的 stdout/stderr 是否在 install4j 中缓冲?
- gradle - 未找到 ID 为“no.nils.wsdl2java”的插件。摇篮
- regex - awk 正则表达式过滤中间字符串
- python - 在python中获取列表最小值的索引
- c - 在不修改库的情况下从 .so 文件访问全局静态变量
- android - 无法解析符号“googleMap”
- javascript - 将 ViewBag 数据加载到 chart.js 多图表中
- react-virtualized - 使用 CDN 的示例反应虚拟化 html 页面
- hive - Hive 中的“分区”是什么,我应该在这里做什么?
- apache - ModSecurity:使用代码 403(第 2 阶段)拒绝访问。使用“multipart/form-data”时