如何使用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";
  }
}
1 个赞

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

1 个赞

子域名的方案确实是理论可行的,但我这边个人站不太方便挂子域名(会存在ssl签发不方便之类的问题),最好还是能挂在子目录

1 个赞

我都是lucky 反代的。。

1 个赞

Lucky能解决部署到子目录的问题吗?如果能的话我了解一下。如果lucky也只能(或者你的用法里只有)部署到根目录,那就算了

1 个赞

那请随意
一般地,配置 acme 泛域名证书会比折腾一套我们没有做支持的部署方式方便很多。

1 个赞

get√ 我其实主要就是想确认一下之前有没有支持过类似的实践(即部署到子目录)。能确认到这个方式并不被支持,也是很有用的信息量。感谢

1 个赞

Update: 最终还是部署到子域名了,代价就是多配一套SSL证书+DNS+CDN+acme.sh。不过还算可以接受

1 个赞