使用Cloudflare Workers对接甲骨文对象存储不仅可以实现防盗链,还能缩短直链,并且在甲骨文翻车后更加容易进行修复替换。

虽然Oracle Cloud文档上写着,如果需要CDN对接对象存储的话,直接使用cname指向甲骨文对象存储域名即可,但我尝试后发现不能正常对接访问。在查阅了Oracle的文档以及多次尝试后,我还是选择使用Cloudflare Workers进行反向代理,从而实现防盗链、缩短直链,并且进一步方便管理。

准备

cyberduck

使用Cyberduck对接好甲骨文对象存储,方法如下:

编辑对象存储可见性为:公共
可见性
获取某个文件的直链如下:

https://a0.compat.objectstorage.us-phoenix-1.oraclecloud.com/US/_%E8%AF%B4%E6%98%8E.html

可以分为三个部分:

https://  -  使用https
a0.compat.objectstorage.us-phoenix-1.oraclecloud.com  -  网址
/US/  -  文件夹
_%E8%AF%B4%E6%98%8E.html  -  文件名(一般中文都被转译了,也可以直接使用中文)

后面将根据这个直链来编写规则。

在网站获取的直链和用Cyberduck不一样,请根据实际情况进行变通

cloudflare

进入 Cloudflare Workers, 注册或登录 Cloudflare 账号, 为 Workers 设置子域名, 创建新的 Worker.

部署

github

前往github项目:

https://github.com/Siujoeng-Lau/Workers-Proxy

仔细阅读README_zh.md

部署worker

自定义 'src/index.js', 将代码复制到在线编辑器中, 替换默认代码.

只需要修改index.js的部分如下所示

常量

// 代理网站
const upstream = 'www.google.com'

// 代理网站的目录
const upstream_path = '/'

// 手机用户代理网站
const upstream_mobile = 'www.google.com'

// 屏蔽国家和地区
const blocked_region = ['CN', 'KP', 'SY', 'PK', 'CU']

// 屏蔽 IP 地址
const blocked_ip_address = ['0.0.0.0', '127.0.0.1']

// 源站是否开启 HTTPS
const https = true

// 是否允许浏览器缓存
const disable_cache = false

// 文本替换
const replace_dict = {
    '$upstream': '$custom_domain',
    '//google.com': ''
}

你可以参考我的配置:

// Website you intended to retrieve for users.
const upstream = 'a0.compat.objectstorage.us-phoenix-1.oraclecloud.com'

// Custom pathname for the upstream website.
const upstream_path = '/US/'

// Website you intended to retrieve for users using mobile devices.
const upstream_mobile = 'a0.compat.objectstorage.us-phoenix-1.oraclecloud.com'

// Countries and regions where you wish to suspend your service.
const blocked_region = ['']

// IP addresses which you wish to block from using your service.
const blocked_ip_address = ['']

// Whether to use HTTPS protocol for upstream address.
const https = true

// Whether to disable cache.
const disable_cache = true

// Replace texts.
const replace_dict = {
    '$upstream': '$custom_domain'
}

其中:

`代理网站`与`手机用户代理网站`的域名都填对象存储的域名
去掉`屏蔽国家和地区`与`屏蔽 IP 地址`
去掉`文本替换`自带的内容

更改 Worker 名称, 保存代码并部署。

此时你可以使用cloudflare worker分配给你的域名,例如:test.workers.dev

绑定自定义域名

检查你自己的域名是否接入 Cloudflare.(使用CFP或者NS接入均可)

跳转到域名的控制面板, 选择 'Workers' 页面, 点击 'Add Route'.

在 Route 中输入 https://<自定义域名>/* 并且选择刚创建的 Worker.

为自定义域名添加 CNAME DNS 记录. 在 DNS 页面中, 在 'Name' 区域输入自定义域名的子域名 (或者 @), 在 'Target' 区域输入 Worker 的二级域名 (例如 test.workers.dev), 将代理状态选择为 '代理'.

记得打开你域名的Hotlink 保护

使用

假如
文件直链是:https://a0.compat.objectstorage.us-phoenix-1.oraclecloud.com/US/_%E8%AF%B4%E6%98%8E.html
你自己的域名是:a.abc.com
worker域名是:test.workers.dev

此时你可以使用https://test.workers.dev/_%E8%AF%B4%E6%98%8E.html或者https://a.abc.com/_%E8%AF%B4%E6%98%8E.html直接访问文件,为了便于管理以及实现防盗链,请使用你自己的域名进行访问,即:https://a.abc.com/_%E8%AF%B4%E6%98%8E.html,未来甲骨文翻车后,你直接替换反向代理的源站以及目录即可,在博客上的直链就不用进行替换了。

排错

在我测试过程中,我已经发现并和Workers-Proxy项目作者排除了部分问题。

直链被chrome以文本打开

造成问题的原因是 甲骨文对象存储 在 Response Header 中没有提供该文件的 "content-type", Cloudflare 的 No-Sniff Header 功能禁止 Chrome 主动判断文件类型. (Chrome 无法识别该文件为视频文件, 所以无法下载)

解决方法:

  1. 进入 Cloudflare 对应域名的 SSL/TLS 设置
  2. HTTP Strict Transport Security (HSTS) 选择 Change HSTS Settings
  3. No-Sniff Header 设置为 Off

其他问题

其他问题请在评论区或者GitHub的issues进行提问。


参考:
Siujoeng-Lau/Workers-Proxy

最后修改:2020 年 05 月 21 日
如果觉得我的文章对你有用,请随意赞赏