Express.js使用自定义子域名中间件时静态资源服务不生效求助
问题核心原因
你当前的请求在未匹配到特定逻辑时没有触发响应,导致请求挂起超时,具体是两个疏漏:
/assets路径下的静态资源如果没被express.static匹配到,会自动流转到后续的app.get("*")通配符路由,而你通配符路由里的逻辑完全没有处理长度超过2的url路径(比如/assets/js/main.js拆分后路径数组长度为3),也没有兜底响应,请求会一直挂起直到超时。- 子域名判断逻辑会拦截子域名下的所有请求,包括静态资源请求,直接返回字符串内容,不会返回对应的JS/CSS文件。
解决思路
- 给静态资源中间件加404兜底,避免未命中的静态资源请求流入后续业务路由:
app.use("/assets", express.static(path.join(__dirname, "assets")), (req, res) => { res.status(404).send("静态资源不存在"); });
- 通配符路由开头先过滤静态资源路径,同时加全局兜底响应:
app.get("*", (req, res, next) => { // 提前过滤静态资源请求,防止被业务逻辑拦截 if (req.path.startsWith('/assets')) return next(); let host = req.get("host").split("."); console.log(req.originalUrl); let url = req.originalUrl.split("/"); url.shift(); console.log(url); let hasResponse = false; if (host.length > 2) { res.send("myWebsite.com"); hasResponse = true; } else { const pages = Page.getPages(); pages.forEach(page => { if ((url[0] == "" ? "home" : url[0] ?? "home").toLowerCase() == page.name) { if (url.length == 1 || (url.length == 2 && url[1] == "")) { page.publish(res); hasResponse = true; } } }); } // 所有逻辑都未命中时兜底返回404 if (!hasResponse) { res.status(404).send("页面不存在"); } });
- 如果子域名站点也需要使用相同的静态资源,去掉通配符路由开头的静态资源过滤逻辑,把子域名返回逻辑放在路径匹配之后即可,避免拦截静态资源请求。
内容的提问来源于stack exchange,提问作者Mark Reggiardo
相关产品推荐
相关产品推荐

