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

通过ngnix反向代理的webdav无法导入书籍 #3897

Open
4 tasks done
gfyuye opened this issue Apr 27, 2024 · 17 comments
Open
4 tasks done

通过ngnix反向代理的webdav无法导入书籍 #3897

gfyuye opened this issue Apr 27, 2024 · 17 comments
Labels
BUG B.软件未按预期的功能运行

Comments

@gfyuye
Copy link

gfyuye commented Apr 27, 2024

确认 / Assignments

  • 搜索现有issues,不存在相似或相关的issue / No similar or related issues
  • 最新测试版依然存在此问题 / Latest beta app does not work
  • 此问题和Xposed、Lsposed、Magisk、手机主题、浏览器插件等无关 / Make sure your machine is not touched by hook frameworks, plugins etc

问题描述 / Describe Bugs

自己搭建的hectorqin服务器,使用其自带的webdav作为书库。经过nginx反向代理为子目录访问,访问链接为https://test.com:1122/dav/。可以正常备份和恢复,本地书籍或缓存好的书籍可以正常导入至webdav。在远程书籍中也能够看到目录下的书籍,但是从远程书籍导入时失败,日志显示导入出错,timeout。查看nginx日志,access.log中只有一条记录"PROPFIND /dav/reader3/webdav/legado/books HTTP/1.1" 207 22862 "-" "Chrome/119.0.0.0 Safari/537.36 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"。error.log中无任何记录。

我的nginx设置为:
server {
#添加加ssl和http2协议的要求。
listen 1122 ssl ; #ipv4
#修改为自己申请的域名
server_name test.com;
###添加秘钥

Mozilla Intermediate configuration

ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
#以下协议需要确认硬件是否支持,如果不支持或者不确定可以直接去除
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
#以下修改为自己申请的域名公钥和私钥文件地址
ssl_certificate ;
ssl_certificate_key ;
##############
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
if ($server_port !~ 1122){
rewrite ^(/.*)$ https://$host$1 permanent;
}
error_page 497 https://$host$request_uri;

location / {

}

location /dav/ {

gzip on; #开启gzip压缩
gzip_min_length 1k; #设置对数据启用压缩的最少字节数
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 6; #设置数据的压缩等级,等级为1-9,压缩比从小到大
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml; #设置需要压缩的数据格式
gzip_vary on;
client_max_body_size   50m; #允许上传50MB文件,上传本地书籍需要修改此项大小.如nginx主配置文件已添加,删除此行并修改主配置即可

#修改为自己需要代理的局域网ip和端口号
proxy_pass http://112.128.1.21:1122/; #阅读
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $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-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}

access_log /var/log/nginx/access.log; #;
error_log /var/log/nginx/error.log; # ; 

}

复现步骤 / How to reproduce

每次使用都是如此

确认 / Assignment

  • 已经提交复现所需要的附加资料 / Submit additions related with bugs

其他信息 / Additions

No response

日志提交 / Relevant log output

No response

阅读版本 / Legado version

3.23.110211

Android版本 / Android version

HarmonyOS 4.0.0

机型 / Model

HUAWEI Mate 40

@gfyuye gfyuye added the BUG B.软件未按预期的功能运行 label Apr 27, 2024
@821938089
Copy link
Collaborator

821938089 commented Apr 27, 2024

把error_page那一行改成这个:
error_page 497 https://$http_host$request_uri;
proxy_set_header Host $http_host;

@gfyuye
Copy link
Author

gfyuye commented Apr 27, 2024

之前试过这个方法了,还是一样。

@821938089
Copy link
Collaborator

那你抓包看看吧,timeout我猜就是因为webdav给的地址不对导致的
这个服务器版的webdav实现是有问题的,好像返回的是绝对路径,导致有问题,建议去那边反馈下
还有他给的那个nginx配置只能用默认端口,改别的端口就会有问题,你可以试试用默认端口

@gfyuye
Copy link
Author

gfyuye commented Apr 27, 2024

默认接口也试过了,情况一样。而且如果在远程书籍里添加了其他的服务器地址,不管是reader自带的webdav还是群晖的,都会有错误记录,upstream指向了location / {} 字段,从而显示找不到页面。

@gfyuye
Copy link
Author

gfyuye commented May 8, 2024

而阅读中备份与恢复功能中设置了其他通过nginx代理的webdav服务器,该服务器在其他软件中使用正常。在阅读中,备份和恢复功能也是正常的。
在远程书籍中使用默认服务器,可以看到书籍列表,此时nginx的access.log中记录为:
"PROPFIND /my/book/legado/books HTTP/1.1" 207 1800 "-" "Chrome/119.0.0.0 Safari/537.36 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
而error.log中无记录。
成功上传本地的1.txt,此时nginx的access.log中记录为:
"PUT /my/book/legado/books/1.txt HTTP/1.1" 201 300 "-" "Chrome/119.0.0.0 Safari/537.36 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
而error.log中无记录。
当尝试导入其中的1.txt时,access.log中记录为:
"GET /book/legado/books/1.txt HTTP/1.1" 404 555 "-" "Chrome/119.0.0.0 Safari/537.36 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
当使用get方式导入书籍,丢失了/my这个目录。此时error.log中记录为:
[error] 13306#13306: *65358 open() "/usr/share/nginx/html/book/1.txt" failed (2: No such file or directory), client: 223.104.150.217, server: my.com, request: "GET /book/1.txt HTTP/1.1", host: "my.com:443"

在远程书籍中单独添加了该服务器,在阅读中打开时可以看到书籍列表,此时nginx的access.log中记录为:
PROPFIND /my/book HTTP/1.1" 207 2240 "-" "Chrome/119.0.0.0 Safari/537.36 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
而error.log中无记录。
成功上传本地的1.txt,此时nginx的access.log中记录为:
"PUT /my/book/legado/books/1.txt HTTP/1.1" 201 282 "-" "Chrome/119.0.0.0 Safari/537.36 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
而error.log中无记录。
当尝试导入其中的1.txt时,access.log中记录为:
"GET /book/1.txt HTTP/1.1" 404 555 "-" "Chrome/119.0.0.0 Safari/537.36 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
可以看到,当使用get方式导入书籍,丢失了/my这个目录。此时error.log中记录为:
[error] 13306#13306: *65358 open() "/usr/share/nginx/html/book/1.txt" failed (2: No such file or directory), client: 223.104.150.217, server: my.com, request: "GET /book/1.txt HTTP/1.1", host: "my.com:443"

通过2次对比,在导入书籍时,都会出现/my这个目录这个情况,从而出现404错误。而使用reader自带的webdav服务器时,导入书籍则是timeout,nginx除了列出书籍列表时的PROPFIND 之外,没有任何记录,就像没有过导入操作一样。

@821938089
Copy link
Collaborator

你自己抓包看一下propfind那个请求的响应内容就知道了,服务器返回的文件地址是错的
nginx反代不要加特定路径,不然地址对不上,或者你想办法修正路径

@gfyuye
Copy link
Author

gfyuye commented May 8, 2024

抓包之后看到propfind的响应是正常的。但是导入时get命令会缺了/my这个目录。然后在备份恢复的时候,propfind,put,get都是正常的。

@gfyuye
Copy link
Author

gfyuye commented May 8, 2024

路径没法修正啊,因为在备份恢复那个地方,propfind,put,get都是正常的,能正常备份和恢复,同步阅读记录也时正常的。导出书籍到webdav也是正常的。在远程书籍里面,列出书籍也是正常的。只有在导入的时候才由问题。然后我看了记录,备份恢复是是先propfind列出文件,然后get下载文件,说明nginx服务器工作是正常的。远程书籍那propfind返回也是正常的,不然是不能正常列出书籍列表来的。但是get的时候就不正常了

1 similar comment
@gfyuye
Copy link
Author

gfyuye commented May 8, 2024

路径没法修正啊,因为在备份恢复那个地方,propfind,put,get都是正常的,能正常备份和恢复,同步阅读记录也时正常的。导出书籍到webdav也是正常的。在远程书籍里面,列出书籍也是正常的。只有在导入的时候才由问题。然后我看了记录,备份恢复是是先propfind列出文件,然后get下载文件,说明nginx服务器工作是正常的。远程书籍那propfind返回也是正常的,不然是不能正常列出书籍列表来的。但是get的时候就不正常了

@821938089
Copy link
Collaborator

你把响应内容发一下吧

@gfyuye
Copy link
Author

gfyuye commented May 15, 2024

error_page 497 https://$http_host$request_uri;
proxy_set_header Host $http_host;

改成这个样子时,抓包结果是:
Transmission Control Protocol, Src Port: 53697, Dst Port: 80, Seq: 0, Len: 0
可以看到目标端口变成了80.

把proxy_set_header Host $http_host;改成proxy_set_header Host $host:$server_port;
抓包后端口对了,但是报错,
[Full request URI: http://192.168.1.1:443/reader3/1.txt]
而应该请求的路径是https://192.168.1.1:443/book/reader3/1.txt
也就是从https变成了http,还丢失了/book这个路径。

@821938089
Copy link
Collaborator

80端口是正确的,nginx会再重定向一次到https
配置nginx不要带book路径应该就可以了
这是reader的问题,你去那边反馈

@gfyuye
Copy link
Author

gfyuye commented May 15, 2024

去那边反映过了,他们认为是nginx配置的问题。但是同样的配置成子文件夹,为什么上传书籍到webdav,备份到webdav,从webdav恢复都没有问题,唯独从webdav导入的时候会有这个情况。

@821938089
Copy link
Collaborator

你抓包看看响应正文就明白了,服务器给的地址是错的

这个是因为导入用的是服务器提供的地址,其他的都是阅读直接硬拼接的地址,如果恢复备份也用服务器提供的地址一样会出问题的

@gfyuye
Copy link
Author

gfyuye commented May 15, 2024

哦,那应该还是nginx设置有问题的可能性更大一点。那为什么导入的时候不用硬拼接的地址呢?

@821938089
Copy link
Collaborator

不知道,我猜可能是多级目录的问题,硬拼接处理多级目录很麻烦,而且硬拼接也不是正确做法

我说的服务器指的是reader,不是nginx,nginx只是代理,一般不会对响应内容做处理

@gfyuye
Copy link
Author

gfyuye commented May 15, 2024

应该不是reader的问题,而是nginx的子目录反向代理设置的问题。或者说reader不支持nginx使用子目录反向代理。因为不用子目录的话一切正常,不使用反向代理直接连接reader的服务器也没有问题。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
BUG B.软件未按预期的功能运行
Projects
None yet
Development

No branches or pull requests

2 participants