如何使用nginx将koishi反代到域名的子目录下(e.g. https://example.com/koishi)

目前使用的是IP:端口的方式,但这样很不优雅,安全性也比较可疑。我看koishi提供了反代,但是只能代理到根目录下(比如 example.com ),而无法代理到子目录。(比如 example.com/koishi )。我只有一个域名,而根目录已经分配了一个网站,所以教程里的方法无法使用。

经过个人初步排查,这是因为html中所有的src都取的是根目录下的路径,(比如 /index.html),这会导致即使我访问了 example.com/koishi ,它还是试图获取 example.com/index.html ,而不是 example.com/koishi/index.html 。我试图魔改了一下nginx配置(如下的sub_filter),没有生效。

location /koishi {
    auth_basic "Please input password.";
    auth_basic_user_file /etc/nginx/passwd;
    proxy_pass http://127.0.0.1:5140/;
    proxy_redirect off;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $http_host;

    sub_filter 'src="/' 'src="/koishi/';
    sub_filter 'href="/' 'href="/koishi/';
    sub_filter 'action="/' 'action="/koishi/';
    sub_filter 'link rel="stylesheet" href="/' 'link rel="stylesheet" href="/koishi/';
}
1 个赞


把selfUrl改成 example.com/koishi 试试(不确定 云的)

1 个赞

试过,没有用,还是会遇到最关键的资源文件相对路径问题。也不排除我用错了。

2 个赞

最简单的办法是丢到子域名下

server {
  listen 443 ssl;
  server_name lark-prod.elchapo.cn;
  ssl_certificate     /nginx/elchapo.pem;
  ssl_certificate_key /nginx/elchapo.key;

  location / {
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   Host $host;
    proxy_pass         http://localhost:5144/;
    proxy_http_version 1.1;
    proxy_set_header   Upgrade $http_upgrade;
    proxy_set_header   Connection "upgrade";
  }
}

如果你完全没有子域名的管理权限,找我拿一个