Apache让Node.js同时服务前端静态文件和后端API的关键,是用Apache作统一入口按请求类型分流:静态资源直出,API请求反向代理至Node.js;需启用mod_proxy、mod_proxy_http和mod_rewrite模块,通过ProxyPass按路径(如/api/)转发,或用RewriteRule结合-f判断实现SPA兜底。

Apache 中让 Node.js 同时服务前端静态文件和后端 API,关键不是让 Node.js 自己“双肩挑”,而是用 Apache 做统一入口,按请求类型分流:静态资源直出,API 请求反向代理到 Node.js。这样既保留 Node.js 的轻量灵活,又发挥 Apache 在缓存、压缩、HTTPS 终止和路径控制上的优势。
用 ProxyPass 按路径分离动静内容
这是最清晰、最易维护的方式。把前端构建产物(如 dist/)放在 Apache 的 DocumentRoot 下,所有以 /static/、/assets/ 或根路径下常见后缀(.js/.css/.png 等)开头的请求,由 Apache 直接返回;而所有 /api/、/v1/ 等前缀的请求,则通过 ProxyPass 转发给本地运行的 Node.js 服务。
- 在 VirtualHost 配置中,先定义静态资源目录:
<Directory "/var/www/myapp/dist">
Require all granted
</Directory> - 再添加代理规则:
ProxyPass /api/ http://localhost:3000/api/
ProxyPassReverse /api/ http://localhost:3000/api/
ProxyPass /v1/ http://localhost:3000/v1/
ProxyPassReverse /v1/ http://localhost:3000/v1/ - 确保 Node.js 服务监听 127.0.0.1:3000(不暴露给外网),且只处理 API 路由,不做静态文件托管
用 RewriteRule 兜底拦截 + 静态文件存在性判断
适用于单页应用(SPA),比如 Vue 或 React 构建的项目。前端路由是客户端的,所有 URL 都应返回 index.html,但前提是该 URL 不对应真实静态文件(如 /logo.png)或 API 路径(如 /api/login)。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 在 .htaccess 或 VirtualHost 中加入以下保护逻辑:
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
RewriteCond %{REQUEST_URI} ^/api/ [OR]
RewriteCond %{REQUEST_URI} ^/v1/
RewriteRule ^(.*)$ http://localhost:3000/$1 [P,L]
# 其他请求全部指向 index.html
RewriteRule ^ /index.html [L] - 注意:[P] 标志表示 Proxy,需配合 mod_proxy 启用;[L] 表示终止后续规则,顺序不能错
- 此方式比纯路径匹配更灵活,但调试稍复杂,建议优先用第一种
必须启用并验证的 Apache 模块
缺一不可,否则 ProxyPass 会静默失效或返回 500 错误:
立即学习“前端免费学习笔记(深入)”;
- mod_proxy:代理基础框架
- mod_proxy_http:支持 HTTP/HTTPS 后端通信(Node.js 必选)
- mod_rewrite(如用 RewriteRule):URL 重写能力
- 检查是否生效:运行 httpd -M | grep proxy,输出中应含 proxy_module (shared) 和 proxy_http_module (shared)
安全与性能补充要点
生产环境不能只做转发,还要考虑实际交付质量:
- 静态资源开启 gzip 和 Expires 头:在
块中加 AddOutputFilterByType DEFLATE text/html text/css application/javascript 和 ExpiresActive On; ExpiresByType image/png "access plus 1 year" - API 代理增加超时与连接复用:ProxyTimeout 30; ProxySet keepalive=On
- 禁止将 Node.js 的调试端口(如 9229)暴露到公网;若需远程调试,仅限内网 IP 访问
- 使用 ProxyPreserveHost Off(默认),避免 Node.js 日志里混入错误 Host 值















