You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express.js使用自定义子域名中间件时静态资源服务不生效求助

问题核心原因

你当前的请求在未匹配到特定逻辑时没有触发响应,导致请求挂起超时,具体是两个疏漏:

  1. /assets路径下的静态资源如果没被express.static匹配到,会自动流转到后续的app.get("*")通配符路由,而你通配符路由里的逻辑完全没有处理长度超过2的url路径(比如/assets/js/main.js拆分后路径数组长度为3),也没有兜底响应,请求会一直挂起直到超时。
  2. 子域名判断逻辑会拦截子域名下的所有请求,包括静态资源请求,直接返回字符串内容,不会返回对应的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 20:24:03