Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Nginx反代如何设置location路径 #1129

Closed
JoJoBizarreAdventure opened this issue Feb 5, 2022 · 56 comments
Closed

Nginx反代如何设置location路径 #1129

JoJoBizarreAdventure opened this issue Feb 5, 2022 · 56 comments

Comments

@JoJoBizarreAdventure
Copy link

Is your feature request related to a problem? Please describe.
问题的情景是这样的,cloudreve在本地http://127.0.0.1:5212上运行,我想通过https来进行访问(不单独设置另外端口,就使用443的情况下)
如果设置nginx反代的时候,location指定的路径不选择/而是选择/cloud,请问应该如何进行设置才能正常加载。
我的写法大致如下

location /cloud {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                #proxy_redirect off;
                proxy_pass http://127.0.0.1:5212/;

                rewrite "^/cloud/(.*)$" /$1 break;
                # 如果您要使用本地存储策略,请将下一行注释符删除,并更改大小为理论最大文件尺寸
                client_max_body_size 2G;
        }

我尝试了通过rewrite去去除url中多余的部分,这样可以正常的获取到200,但是其他资源以及api类的请求都是默认在/路径下的
image

Describe the solution you'd like
请问要如何修改nginx配置才能正常访问?
还是cloudreve本身有修改base url的方式吗?

@lsCoding666
Copy link

试下改下这里
image
/api/v3 改成/cloud/api/v3试试?

@JoJoBizarreAdventure
Copy link
Author

试下改下这里 image /api/v3 改成/cloud/api/v3试试?

请问这个需要下载源码版去修改吗?我之前是通过下载release版本解压运行的

@lsCoding666
Copy link

对的,要下载源码然后自己改好后编译和构建,我可以先改下试试行不行

@lsCoding666
Copy link

实际上应该不止改这里 这里只是前端的配置,搜索下这个/api/v3遍布整个项目
image

@JoJoBizarreAdventure
Copy link
Author

实际上应该不止改这里 这里只是前端的配置,搜索下这个/api/v3遍布整个项目 image

这样的话有点麻烦啊,我试试能不能搞个全局变量啥的,作为所有url前的前缀,默认只有/之类的,js不怎么熟悉

@JoJoBizarreAdventure
Copy link
Author

对的,要下载源码然后自己改好后编译和构建,我可以先改下试试行不行

我刚刚看了一下我这本地的日志,除了/api开头的,还有/static开头的请求,那个应该在哪里修改,我没找到

@lsCoding666
Copy link

我对go 前端和nginx都不熟悉,不是搞这个的。我想起来我之前做学校课设的骚操作:我偷懒拿我师兄的课设,由于他的包名和类名都有他的学号,于是我用批量重命名和文件批量查找和替换把他的学号和名字换成我的,程序也能跑。
所以有一个骚操作就是把源代码中的/api/v3/换成/yun/api/v3试试行不行。
本来域名后面/后的路径表示的是文档路径,放在www文件夹下的网站。我也不知道nginx怎么配置才能实现你的目标

@JoJoBizarreAdventure
Copy link
Author

我对go 前端和nginx都不熟悉,不是搞这个的。我想起来我之前做学校课设的骚操作:我偷懒拿我师兄的课设,由于他的包名和类名都有他的学号,于是我用批量重命名和文件批量查找和替换把他的学号和名字换成我的,程序也能跑。 所以有一个骚操作就是把源代码中的/api/v3/换成/yun/api/v3试试行不行。 本来域名后面/后的路径表示的是文档路径,放在www文件夹下的网站。我也不知道nginx怎么配置才能实现你的目标

这样是可以的,理论上只要提一个全局的变量来甚至可以搞出来一个配置项啥的

@lsCoding666
Copy link

lsCoding666 commented Feb 8, 2022

我对go 前端和nginx都不熟悉,不是搞这个的。我想起来我之前做学校课设的骚操作:我偷懒拿我师兄的课设,由于他的包名和类名都有他的学号,于是我用批量重命名和文件批量查找和替换把他的学号和名字换成我的,程序也能跑。 所以有一个骚操作就是把源代码中的/api/v3/换成/yun/api/v3试试行不行。 本来域名后面/后的路径表示的是文档路径,放在www文件夹下的网站。我也不知道nginx怎么配置才能实现你的目标

这样是可以的,理论上只要提一个全局的变量来甚至可以搞出来一个配置项啥的

我自己先试试 能行告诉你

@JoJoBizarreAdventure
Copy link
Author

image
我这边的日志显示是这样的,现在就是两个问题,一个因为默认进来的路径不是/,所以没有重定向到login界面,另一个就是那个路径问题,/api开头的因为都是写在js里的,所以比较好改,但是静态资源的加载,就是/static开头的请求应该怎么改,我也不清楚这个是什么框架,你知道要怎么下手吗?
@lsCoding666

@lsCoding666
Copy link

image 我这边的日志显示是这样的,现在就是两个问题,一个因为默认进来的路径不是/,所以没有重定向到login界面,另一个就是那个路径问题,/api开头的因为都是写在js里的,所以比较好改,但是静态资源的加载,就是/static开头的请求应该怎么改,我也不清楚这个是什么框架,你知道要怎么下手吗? @lsCoding666

参考 https://docs.cloudreve.org/getting-started/build 先啥都不要改能跑起来,我用的ide goland,然后批量查找替换,思路是这样。
不知道你的操作系统是什么,linux的最好办,我的是win。我现在win下跑起来能调试,调试没问题再用wsl进行编译linux的二进制文件

@unauth401
Copy link

试过改参数设置>站点信息>站点URL吗?
改成这样:https://***.***/cloud

@JoJoBizarreAdventure
Copy link
Author

试过改参数设置>站点信息>站点URL吗? 改成这样:https://***.***/cloud

试过,没有用,页面加载之后的http请求和没修改时一样。

@JoJoBizarreAdventure
Copy link
Author

image 我这边的日志显示是这样的,现在就是两个问题,一个因为默认进来的路径不是/,所以没有重定向到login界面,另一个就是那个路径问题,/api开头的因为都是写在js里的,所以比较好改,但是静态资源的加载,就是/static开头的请求应该怎么改,我也不清楚这个是什么框架,你知道要怎么下手吗? @lsCoding666

参考 https://docs.cloudreve.org/getting-started/build 先啥都不要改能跑起来,我用的ide goland,然后批量查找替换,思路是这样。 不知道你的操作系统是什么,linux的最好办,我的是win。我现在win下跑起来能调试,调试没问题再用wsl进行编译linux的二进制文件

我是在ubuntu服务器上跑本地,然后过nginx反代来在外部访问。我先编译源码版试试

@lsCoding666
Copy link

lsCoding666 commented Feb 8, 2022

我昨天编译源码没问题,还改了我几个想要的功能,结果今天编译不过去了。。。
yarn run build失败

解决了 换回官方源就行了

@JoJoBizarreAdventure
Copy link
Author

我昨天编译源码没问题,还改了我几个想要的功能,结果今天编译不过去了。。。 yarn run build失败 解决了 换回官方源就行了

image

我大概整理了一下,大概就是这样的一个问题。改起来可能除了js里面写上了的/api,还会有其他的问题
比如登录界面也不是/login,会变成/cloud/login才能对的上

@lsCoding666
Copy link

lsCoding666 commented Feb 8, 2022

我昨天编译源码没问题,还改了我几个想要的功能,结果今天编译不过去了。。。 yarn run build失败 解决了 换回官方源就行了

image

我大概整理了一下,大概就是这样的一个问题。改起来可能除了js里面写上了的/api,还会有其他的问题 比如登录界面也不是/login,会变成/cloud/login才能对的上

突然想到一个办法,可以单独编译一份前端文件,放到html目录下新建一个文件夹,叫做cloud,然后把前端文件放在里面,然后把前端的baseurl改成后台的url。可能还要做一些改动,比如改下后端接口地址之类的

@lsCoding666
Copy link

我这里已经编译好一份前端文件了我现在就试试

@JoJoBizarreAdventure
Copy link
Author

JoJoBizarreAdventure commented Feb 8, 2022 via email

@lsCoding666
Copy link

试了下有些问题 还得改下代码 前端资源404了
image

@JoJoBizarreAdventure
Copy link
Author

试了下有些问题 还得改下代码 前端资源404了 image

这样是正常的,因为html文件里的header里的引用路径没改。http请求是根据

里面的引用去请求的。
请求的还是原来的路径,只是资源的位置被移动了。我win10下搜了一下好像没看到有直接的html文件,不知道是不是编译了才会有。

@JoJoBizarreAdventure
Copy link
Author

试了下有些问题 还得改下代码 前端资源404了 image

这样是正常的,因为html文件里的header里的引用路径没改。http请求是根据

里面的引用去请求的。
请求的还是原来的路径,只是资源的位置被移动了。我win10下搜了一下好像没看到有直接的html文件,不知道是不是编译了才会有。

image

大概会有这样一些条目,带标注,里面会写引用

@topjohncian
Copy link
Member

package.json 中加一条 homepage , 可以更改前端静态资源的引用路径
详见:Stack OverflowCreate React App Docs


还需补充一点: 前端的上传组件也是绝对路径引入,具体可修改 https://github.com/cloudreve/frontend/blob/b90a49ba5d809e3042bce801ac28fb7cde74c878/src/loader/index.js#L90-L96

@topjohncian
Copy link
Member

我推荐的简单方法为:再直接反代 /api/static 等等 API 路由 和 前端静态文件

Cloudreve 在设计之初就没有考虑二级目录,建议直接部署于 /

@JoJoBizarreAdventure
Copy link
Author

我推荐的简单方法为:再直接反代 /api/static 等等 API 路由 和 前端静态文件

Cloudreve 在设计之初就没有考虑二级目录,建议直接部署于 /

部署于/就是默认的,那个我已经试过成功了,但是会占用一个单独的端口号,我希望是在https的默认端口下用一个二级目录去区分哪些是网盘这边的功能,然后一些其他的功能用其他的二级路径

@lsCoding666
Copy link

我推荐的简单方法为:再直接反代 /api/static 等等 API 路由 和 前端静态文件

Cloudreve 在设计之初就没有考虑二级目录,建议直接部署于 /

部署于/就是默认的,那个我已经试过成功了,但是会占用一个单独的端口号,我希望是在https的默认端口下用一个二级目录去区分哪些是网盘这边的功能,然后一些其他的功能用其他的二级路径

你的意思是整个cloudreve的前端后端和nginx都用443端口吗,没有5212吗?

@JoJoBizarreAdventure
Copy link
Author

JoJoBizarreAdventure commented Feb 8, 2022

我推荐的简单方法为:再直接反代 /api/static 等等 API 路由 和 前端静态文件

Cloudreve 在设计之初就没有考虑二级目录,建议直接部署于 /

部署于/就是默认的,那个我已经试过成功了,但是会占用一个单独的端口号,我希望是在https的默认端口下用一个二级目录去区分哪些是网盘这边的功能,然后一些其他的功能用其他的二级路径

你的意思是整个cloudreve的前端后端和nginx都用443端口吗,没有5212吗?

不是不是,是cloudreve本地监听http://127.0.0.1:5212运行,nginx监听https://web/cloud,然后nginx负责把消息转发过去

@lsCoding666
Copy link

我尝试完毕了 觉得很麻烦。
image
虽然这里所有响应都是200了,但是前端的路由所有都得改

这种问题我已经解决了 你可以看到我上面的截图这些api都返回200 是正确的。
比如说 能够读取正确的站点配置
image

我的方法是(我用的apache2)反代是这么写的:

<virtualhost *:80>
ServerName pan.c34.pw
<proxy>
Order deny,allow
Allow from all
</proxy>

ProxyRequests Off
ProxyPreserveHost On
AllowEncodedSlashes On

ProxyPass /api http://127.0.0.1:5212/api/  nocanon
ProxyPassReverse /api http://127.0.0.1:5212/api/
</virtualhost>

我将编译好的前端文件直接放在/var/www/html/cloud内,这样访问http://pan.c34.pw/cloud的时候就能直接访问前端文件,没有反代。前端代码稍微修改了一下,在 package.json 中加一条 homepage ,让前端能够正常显示。
当点击左上角的登录按钮的时候,url会变成http://pan.c34.pw/login,而不是http://pan.c34.pw/cloud/login。而直接访问http://pan.c34.pw/cloud/login会404,这就说明还有很多地方要改代码,不是反代能解决的。
api我解决了,静态资源我也解决了,但是还是不行。

我也想过这么写反代
ProxyPass /cloud http://127.0.0.1:5212/
并且把前端文件中的baseurl改为/cloud/api/v3,这样前端请求的api地址就会变成`http://pan.c34.pw/cloud/api/v3。我编译好前端后放在二进制文件同级目录下,这样就可以使用我自定义的前端
但是出现了这样的错误
image
image

image
image
直接访问http://pan.c34.pw/cloud/api/v3/site/config 显示也是一样的
image

貌似是反代写的有问题,按道理这种方法应该是可以的

@topjohncian
Copy link
Member

可以发出 URL 让我看一下吗

@JoJoBizarreAdventure
Copy link
Author

JoJoBizarreAdventure commented Feb 8, 2022 via email

@topjohncian
Copy link
Member

Reply @JoJoBizarreAdventure :
报错原因为: /cloud/api/v3/site/config 没有正确反代和返回正确请求

为了适配 BrowserHistory ,后端 所有 空路由都会返回前端的 index.html

这里是后端收到的请求路径为 /cloud/api/v3/site/config 而非 /api/v3/site/config 而导致的后端 空路由,所以返回了前端的 index.html

@lsCoding666
Copy link

lsCoding666 commented Feb 8, 2022

可以发出 URL 让我看一下吗

http://pan.c34.pw/cloud 目前是这么写的反代ProxyPass /cloud http://127.0.0.1:5212/

我貌似发现问题了 有些url有两道//
image
可能有些错误?

@JoJoBizarreAdventure
Copy link
Author

可以发出 URL 让我看一下吗

我这边的网址是这个
https://khl.pub/cloud/login
目前反代的写法是

        #############
        # cloudreve #
        #############

        location /cloud {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                proxy_pass http://127.0.0.1:5212/;

                #rewrite "^/cloud/(.*)$" /$1 break; 
                # 如果您要使用本地存储策略,请将下一行注释符删除,并更改大小为理论最大文件尺寸
                client_max_body_size 2G;
        }

@topjohncian
Copy link
Member

Reply to @JoJoBizarreAdventure :

package.json 中加一条 homepage ,让前端能够正常显示。
当点击左上角的登录按钮的时候,url会变成http://pan.c34.pw/login,而不是http://pan.c34.pw/cloud/login。而直接访问http://pan.c34.pw/cloud/login会404,这就说明还有很多地方要改代码,不是反代能解决的。

这里需要在 https://github.com/cloudreve/frontend/blob/b90a49ba5d809e3042bce801ac28fb7cde74c878/src/index.js#L37 处更改为

<ConnectedRouter history={history} basename="/cloud">

@lsCoding666
Copy link

lsCoding666 commented Feb 8, 2022

可以发出 URL 让我看一下吗

http://pan.c34.pw/cloud 目前是这么写的反代ProxyPass /cloud http://127.0.0.1:5212/

我貌似发现问题了 有些url有两道// image 可能有些错误?

这个问题是反代写的不对 应该写为
ProxyPass /cloud/ http://127.0.0.1:5212/ nocanon
而不是
ProxyPass /cloud http://127.0.0.1:5212/ nocanon

现在不会报读取不到配置了 会自动跳转到登陆界面 但是url是http://pan.c34.pw/login 而不是http://pan.c34.pw/cloud/login

@lsCoding666
Copy link

basename="/cloud"

好的 我试试

@topjohncian
Copy link
Member

可以发出 URL 让我看一下吗

http://pan.c34.pw/cloud 目前是这么写的反代ProxyPass /cloud http://127.0.0.1:5212/

我貌似发现问题了 有些url有两道// image 可能有些错误?

这个问题是反代写的不对 应该写为 ProxyPass /cloud/ http://127.0.0.1:5212/ nocanon 而不是 ProxyPass /cloud http://127.0.0.1:5212/ nocanon

现在不会报读取不到配置了 会自动跳转到登陆界面 但是url是http://pan.c34.pw/login 而不是http://pan.c34.pw/cloud/login

这个你看我上一条回复

@topjohncian
Copy link
Member

另外请 @lsCoding666 @JoJoBizarreAdventure 将静态文件存放为 Cloudreve 同目录下,名为 statics 的文件夹 (无则 mkdir),然后重启 Cloudreve
必须重启!!!

Cloudreve
|- statics
  |- static (folder)
    |- js
    ...
  |- index.html
  ...
|- cloudreve (main program)

程序会默认读取自带的静态文件,但程序检测到 statics 文件夹, 就会使用 statics 文件下的静态资源

@lsCoding666
Copy link

可以发出 URL 让我看一下吗

http://pan.c34.pw/cloud 目前是这么写的反代ProxyPass /cloud http://127.0.0.1:5212/

我貌似发现问题了 有些url有两道// image 可能有些错误?

这个问题是反代写的不对 应该写为 ProxyPass /cloud/ http://127.0.0.1:5212/ nocanon 而不是 ProxyPass /cloud http://127.0.0.1:5212/ nocanon
现在不会报读取不到配置了 会自动跳转到登陆界面 但是url是http://pan.c34.pw/login 而不是http://pan.c34.pw/cloud/login

这个你看我上一条回复

改好了 试了下还是那个没启用javascript的异常
image

@lsCoding666
Copy link

lsCoding666 commented Feb 8, 2022

另外请 @lsCoding666 @JoJoBizarreAdventure 将静态文件存放为 Cloudreve 同目录下,名为 statics 的文件夹 (无则 mkdir),然后重启 Cloudreve 必须重启!!!

Cloudreve
|- statics
  |- static (folder)
    |- js
    ...
  |- index.html
  ...
|- cloudreve (main program)

程序会默认读取自带的静态文件,但程序检测到 statics 文件夹, 就会使用 statics 文件下的静态资源

重启了 前面的操作都重启过的
后端ri'zhi日志看起来都正常
image

@lsCoding666
Copy link

可以发出 URL 让我看一下吗

我这边的网址是这个 https://khl.pub/cloud/login 目前反代的写法是

我看了下你的也是这个错误
image

@topjohncian
Copy link
Member

可以发出 URL 让我看一下吗

我这边的网址是这个 https://khl.pub/cloud/login 目前反代的写法是

我看了下你的也是这个错误 image

这个是 反代的原因

@topjohncian
Copy link
Member

Reply to This :
由于依赖的库的 Issue,此问题暂时没有好的解决办法

能解决这个问题的办法只有去改依赖库的源码,具体你可以在 Cloudreve 群管理里联系我

也向各位 Watchers 说声抱歉,可能打扰到各位了,后续会在这个 Issue 里更新

@topjohncian
Copy link
Member

@JoJoBizarreAdventure
Copy link
Author

basename="/cloud"

我尝试了一下,修正反代,包括修改那个index.js,最后结果勉强能登陆,但是Router还是有问题。在经历一两次跳转和上传下载文件后就突然404了。
后续如果有添加这个feature的话,可以在这个issue里@我一下,谢谢

@wanstr
Copy link

wanstr commented Feb 9, 2022

终于发现有人跟我一样的问题了,还以为是我自己的配置的问题呢。感觉这个需求挺常见的,捣鼓了半天没弄出来就放弃了。

@kmg76
Copy link

kmg76 commented Jul 29, 2022

想要二级目录,但文件太多了,都不知道要修改那个文件,像这个Vue就可以更改html指定文件路径https://cli.vuejs.org/config/#publicpath

@PeteWorkspaces
Copy link

这个需求感觉还是很有必要的!特别是只想一个nginx代理多个服务!

@PeteWorkspaces
Copy link

这个需求感觉还是很有必要的!特别是只想一个nginx代理多个服务!

CleanShot 2023-08-02 at 09 25 34@2x

@wnpllrzodiac
Copy link

有个全局配置会简单很多

@leeseven1211
Copy link

这个目前解决了吗

@syniox
Copy link

syniox commented Feb 11, 2024

这个需求感觉还是很有必要的!特别是只想一个nginx代理多个服务!

nginx server_name字段不好用吗

@jieny
Copy link

jieny commented Mar 19, 2024

2024了,还没解决方案吗?

@zzti
Copy link

zzti commented May 7, 2024

原来不止我在挣扎,挣扎过了,放弃修改

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests