反向代理 FODI 实现高速下载 OneDrive

2020/03/08 · 技术经验 · 8553次阅读
在有的网络环境下 OneDrive 的速度非常慢,OneIndex 等类似程序无法正常下载和在线观看视频,如果自己有服务器可以使用反向代理来加速

什么是 FODI

Fast OneDrive Index / FODI,无需服务器的 OneDrive 快速列表程序

GitHub DEMO 安装方法

前言

FODI 和各大 OneDrive 列表程序(如 OneIndex、PyOne、OneList 等等)一样都是只有前端跑服务器的流量(FODI 甚至可以把前端部署到GitHub Pages 完全不需要自己的服务器)

而下载文件或是在线观看视频直接走的 OneDrive 的直链,也就是直接从微软的服务器上下载

这是这类程序最吸引人的地方——超低成本就能拥有一个超大的分享网盘

然而在有的网络环境下 OneDrive 的速度非常慢,无法正常下载和在线观看视频

这时候聪明的同学只需要富强就可以高速下载 OneDrive 了

然而并不是所有同学都这么聪明……有什么办法可以解决这一点呢?

——如果你是聪明的同学,拥有一台闲置的,带宽和流量都比较大(但是硬盘小)的服务器

你就可以使用反向代理来加速 OneDrive 了!

操作反代之后将使用你的服务器的流量来跑 OneDrive 下载,如果是限制小流量、按流量收费的服务器请谨慎尝试!!

如何操作呢

准备

首先你需要有以下条件

  • 拥有一台服务器(VPS、独立服务器等能够搭建互联网服务的均可,如果是限制小流量、按流量收费的服务器请谨慎尝试)
  • 已经搭建好FODI(OneIndex也可,但本教程没有写明方法,以后可能会写)

开始

服务器安装好 Nginx 或是 Caddy 等支持反向代理的软件(Caddy的反向代理较简单,教程以 Nginx 为例)

如果使用宝塔面板创建反向代理

  1. 直接添加站点,不需要FTP不需要数据库,PHP版本可以选择为纯静态
  2. 设置站点,到如图界面

    image-20200308215811353

  3. 打开自己的 FODI ,随意下载一个文件,然后在下载列表中右键点击下载的文件,选择【复制链接地址】

    image-20200308220857092

  4. 截选出上图红框中的部分

    复制出的链接:
    https://c*****e-my.sharepoint.com/personal/*****com/_layouts/15/download.aspx?UniqueId=e46c6e......
    截选的部分:
    https://c*****e-my.sharepoint.com
  5. 把截选出来的部分填入步骤2的【目标url】中,提交即可

    image-20200308221026619

完成这个步骤后可以跳过下面不使用宝塔面板的步骤

如果不使用宝塔面板创建反向代理

直接使用 Nginx 设置配置文件

进行以下步骤请保证你有使用 Nginx 建站基础,服务器上已经安装 Nginx

如果不使用ssl证书(强烈建议使用ssl证书,否则可能会出现未知错误)

server
{
    listen 80;
    server_name yours.domainname.com;#把这里改成你的站点域名(不能和FODI前端一样!)
    
    location  ~* \.(php|jsp|cgi|asp|aspx)$
    {
        proxy_pass https://yours.sharepoint.com;#把这里改成使用宝塔面板步骤3、步骤4的截选出的链接
        proxy_set_header Host yours.sharepoint.com;#把这里改成上面链接去掉https://
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header Range $http_range;#此项感谢评论区超音速的提醒
    }
    location /
    {
        proxy_pass https://yours.sharepoint.com;#把这里改成使用宝塔面板步骤3、步骤4的截选出的链接
        proxy_set_header Host yours.sharepoint.com;#把这里改成上面链接去掉https://
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header Range $http_range;#此项感谢评论区超音速的提醒
        
        add_header X-Cache $upstream_cache_status;
        add_header Cache-Control no-cache;
        expires 12h;
    }
    
}

【推荐】如果使用ssl证书(ssl证书请自行解决)

server
{
    listen 80;
    listen 443 ssl http2;
    server_name yours.domainname.com;#把这里改成你的站点域名(不能和FODI前端一样!)
    
    ssl_certificate    /usr/share/nginx/ssl/pem.crt;#修改成自己的ssl证书(PEM格式)的存放位置
    ssl_certificate_key    /usr/share/nginx/ssl/ssl.key;#修改成自己的ssl密钥(KEY)的存放位置
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    
location  ~* \.(php|jsp|cgi|asp|aspx)$
    {
        proxy_pass https://yours.sharepoint.com;#把这里改成使用宝塔面板步骤3、步骤4的截选出的链接
        proxy_set_header Host yours.sharepoint.com;#把这里改成上面链接去掉https://
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header Range $http_range;#此项感谢评论区超音速的提醒
    }
    location /
    {
        proxy_pass https://yours.sharepoint.com;#把这里改成使用宝塔面板步骤3、步骤4的截选出的链接
        proxy_set_header Host yours.sharepoint.com;#把这里改成上面链接去掉https://
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header Range $http_range;#此项感谢评论区超音速的提醒
        
        add_header X-Cache $upstream_cache_status;
        add_header Cache-Control no-cache;
        expires 12h;
    }
}

完成之后重启nginx,如无报错则继续接下来的步骤

测试刚刚建的站是否能正常访问

直接浏览器访问 http://yours.domainname.com (或使用了ssl后 https://yours.domainname.com

打开后白屏的话等待一会儿,直到跳转到微软的登录界面即为成功

如果不成功则检查上面的配置,实在找不到问题可以把配置发到评论来检查下

修改FODI的后端的代码

打开 CloudFlare 的 Workers 的代码编辑界面

添加如下内容到 const ONEDRIVE_REFRESHTOKEN 的下面

const ORIGIN_URL = "https://yours.sharepoint.com"    //填入上面截选出的链接
const PROXY_URL = "https://yours.domainname.com"    //填入你创建的

image-20200308223009141

搜索 return Response.redirect(url, 302) 在其后面添加

.replace(RegExp(ORIGIN_URL,"g"),PROXY_URL)

(注意要有前面的点)
添加后变成

return Response.redirect(url.replace(RegExp(ORIGIN_URL,"g"),PROXY_URL), 302)

然后翻到代码最下面,找到两个 return JSON.stringify ,在最下面的那个的最后添加代码(注意要有前面的点)

.replace(RegExp(ORIGIN_URL,"g"),PROXY_URL)

image-20200308223519973

最后保存

然后直接打开 workers.dev 链接

image-20200308223826497

等待返回结果,如果你的首页有文件(而不是只有文件夹)的话,可以看到返回的 url 里已经是你创建的反代网站的地址了

image-20200308224141014

去 FODI 随便下载个文件试试吧~(同样下载的时候,下载列表里可以【复制链接地址】,然后粘贴出来,看看是不是已经是自己创建的反向代理的链接了)

结束语

OneIndex 等其他类似程序也可以这样反代,有兴趣的小伙伴可以自行研究自己使用的 OneDrive 列表程序的代码并替换 url 。

其实我最开始就是在 OneIndex 实现的反代,之所以最后选择 FODI 是因为我单纯地觉得他列出文件的方式更简洁好看。

精选评论

超音速:
2020-03-09 07:50
另外还有一个问题,还是大文件下载他会预先下载部分内容,对于小硬盘来说会直接撑爆硬盘,还有预载的超快下载速度会使CPU很容易占用超过50%(针对某mach机器和其他限制严重机器)还要再限制一下缓存占用

#↓↓↓↓↓以下是小缓存设置↓↓↓↓
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 2M;
proxy_busy_buffers_size 10M;
proxy_max_temp_file_size 0;
#↓↓↓↓↓↓↓↓以下是0缓存设置↓↓↓
proxy_buffering off;

以上内容添加到 宝塔反向代理配置中,或是 Nginx 配置中的很多排的 proxy_set_header 的下面即可!

标签:反向代理,Nginx,FODI,OneDrive

最后编辑于:2021/08/23 17:25

🎯添加新评论

  1. 2022-04-07 10:25

    舒服了舒服了,终于可以愉快在线看番了

    回复
  2. 2021-11-20 16:33

    我用OneDrive个人版提取到的下载链接是https://public.bn.files.1drv.com/xxx的格式,尝试反代也是OK的,SharePoint的子域名或许是E5之类套餐才有的?

    回复
    1. 2021-12-13 20:50

      估计是的

      回复
  3. 2020-12-27 12:09

    感谢博主提供的教程,已经用甲骨文VPS搭建了一个,与cloudreve配合特别好用。

    回复
    1. 2021-02-20 00:37

      好,能帮到忙就好

      回复
  4. kafka kafka
    2020-07-05 14:46

    博主的反代还能正常使用吗?我一直用的好好的,最近访问FODI突然开始报跨域错误

    回复
    1. kafka kafka
      2020-07-06 19:28

      没事了,我的问题

      回复
  5. 2020-03-09 07:50

    另外还有一个问题,还是大文件下载他会预先下载部分内容,对于小硬盘来说会直接撑爆硬盘,还有预载的超快下载速度会使CPU很容易占用超过50%(针对某mach机器和其他限制严重机器)还要再限制一下缓存占用
    ↓↓↓↓↓以下是小缓存设置↓↓↓↓
    proxy_buffering on;
    proxy_buffer_size 4k;
    proxy_buffers 8 2M;
    proxy_busy_buffers_size 10M;
    proxy_max_temp_file_size 0;
    ↓↓↓↓↓↓↓↓以下是0缓存设置↓↓↓
    proxy_buffering off;

    回复
    1. 2020-03-09 08:27

      配置我简化过 因为我那个机器测试了下修改缓存的设置速度会变慢所以就没加
      还有用反代而不是rclone+网盘程序也是这个原因 rclone加网盘程序会把是cpu占用直接99%

      还有服务器最好安装bbr使用233

      回复
  6. 2020-03-09 07:30

    怕论坛看不到,特来留言。
    你这个有一个问题就是下载大文件暂停重连就会找不到range,还要再加上proxy_set_header Range $http_range;
    另外尽量不要使用IDM这种工具,断线再连就会401,所以下到99%断线基本上就废了,目前不知道什么原因,各位大佬有兴趣可以研究一下。

    回复
    1. 2020-03-09 08:23

      谢谢啦

      回复
  7. 2020-03-08 23:21

    OneIndex的方法如下:

    前面步骤和文章一样
    修改程序的步骤
    打开 oneindex目录/lib/onedrive.php
    找到

    foreach((array)$data['value'] as $item){

    //var_dump($item); $items[$item['name']] = array( 'name'=>$item['name'], 'size'=>$item['size'], 'lastModifiedDateTime'=>strtotime($item['lastModifiedDateTime']), 'downloadUrl'=>$item['@microsoft.graph.downloadUrl'], 'folder'=>empty($item['folder'])?false:true ); }

    并修改 downloadUrl 为
    'downloadUrl'=>str_ireplace("截取的链接","反代的链接",$item['@microsoft.graph.downloadUrl']),

    回复
    1. zy zy
      2020-03-13 23:15

      博主,按照你的方法设置了,最后但是访问fodi后会直接跳转到onedrive页面,是设置的不对么?按照宝塔的方法设置的,还有这句没看懂,#把这里改成你的站点域名(不能和FODI前端一样!),还请指教,谢谢

      回复
      1. 2020-03-13 23:42

        问题就出在你没看懂的这里
        字面意思FODI的前端站点域名
        和反代用的站点域名不能用一样的

        回复