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

反向代理下如何将静态站点根目录置于子目录?

解决方案

你的问题核心是静态站点使用了根路径(/开头)的资源引用,导致浏览器从主域名根目录请求资源,而非/foo/子路径。以下是两种可行的解决方法:

方法一:通过Nginx配置修正路径

修改location /foo的配置,既调整请求转发规则,又替换响应中的资源路径:

server {
  listen 443 ssl;
  server_name example.com;

  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  location / {
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_read_timeout 3600;

    proxy_pass http://example-site/;
  }

  # 修改后的/foo路径配置
  location /foo/ {
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_read_timeout 3600;

    # 将/foo/xxx重写为/xxx后转发给后端
    rewrite ^/foo/(.*)$ /$1 break;
    proxy_pass http://example-web-foo/;

    # 替换响应中根路径的资源引用为/foo/前缀
    sub_filter 'href="/' 'href="/foo/';
    sub_filter 'src="/' 'src="/foo/';
    # 确保替换所有匹配项,而非仅第一个
    sub_filter_once off;
  }
}

关键说明:

  • 把location /foo改为location /foo/,避免误匹配类似/foobar的路径
  • rewrite规则会剥离请求URL中的/foo/前缀,让后端站点正常处理请求
  • sub_filter会替换HTML响应中所有以/开头的href和src属性,让浏览器从/foo/路径请求资源

方法二:修改静态站点的资源引用规则

如果有权限修改静态站点代码,这是更彻底的方案:

  • 在所有HTML文件的<head>标签中添加<base href="/foo/">,这样所有根路径的资源引用会自动带上/foo/前缀
  • 或者将资源引用改为相对路径(比如把/assets/css/style.css改为./assets/css/style.css,需根据文件层级调整)

内容的提问来源于stack exchange,提问作者Gomi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:32:38