注意
本文不再更新
所以程序如果有更新,本文也不会同步更新。
所以建议前往我的Github仓库,那里有最新的代码和部署教程。
如果你不会使用Workers,请看《Cloudflare Workers》。
引言
在上一篇文章中,介绍了利用CF Workers搭建反向代理。
我在引言中提到可以用反代来下载一些难以连通的网站上的文件,比如Github。
但是如果使用上一篇文章中的反代,也就意味着每个网站都要部署一个Worker,为了方便甚至还要修改系统Hosts。
本篇文章则是教大家用CF Workers搭建一个下载代理,虽然它本质还是一个反代,但是代码做了一些优化调整。
这样我们就可以用:xxx.example.com/download?url=下载链接,这样的形式进行加速文件下载。
正文
1.部署代码
相信有了之前的操作经验,你已经知道如何使用CF Workers了,如果你还不会,请先看《Cloudflare Workers》。本文不做过多赘述。
直接复制代码到Cloudflare Workers Production,无需做任何修改!
addEventListener('fetch', event => {
const { pathname } = new URL(event.request.url)
if (pathname === '/') {
event.respondWith(handlePageRequest(event.request))
} else if (pathname === '/download') {
event.respondWith(handleDownloadRequest(event.request))
} else {
event.respondWith(new Response('Not Found', { status: 404 }))
}
})
async function handlePageRequest(request) {
const html = `
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件下载</title>
<script>
function getDownloadLink() {
var urlInput = document.getElementById('url');
var downloadLink = document.getElementById('download-link');
var proxyLink = window.location.origin + '/download?url=' + encodeURI(urlInput.value);
downloadLink.textContent = proxyLink;
}
</script>
</head>
<body>
<h1>文件下载</h1>
<form action="/download" method="get">
<label for="url">下载链接:</label>
<input type="text" id="url" name="url" required>
<button type="submit">下载</button>
</form>
<br>
<button onclick="getDownloadLink()">获取下载链接</button>
<p id="download-link"></p>
<p>作者博客:<a href="https://blog.968968.xyz" target="_blank">https://blog.968968.xyz</a></p>
<p>本项目仓库:<a href="https://github.com/zyz0323/Cloudflare-Workers-Download-Proxy" target="_blank">https://github.com/zyz0323/Cloudflare-Workers-Download-Proxy</a></p>
</body>
</html>
`
return new Response(html, {
headers: { 'Content-Type': 'text/html; charset=utf-8' }
})
}
async function handleDownloadRequest(request) {
const url = new URL(request.url)
const downloadUrl = url.searchParams.get('url')
if (!downloadUrl) {
return new Response('请提供文件下载链接。', { status: 400 })
}
const response = await fetch(downloadUrl)
const modifiedHeaders = new Headers(response.headers)
modifiedHeaders.set('Content-Disposition', `attachment; filename=${getFileName(downloadUrl)}`)
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: modifiedHeaders
})
}
function getFileName(url) {
const urlObj = new URL(url)
const pathname = urlObj.pathname
return pathname.substring(pathname.lastIndexOf('/') + 1)
}
点击保存并部署。
此程序源于我的项目zyz0323/Cloudflare-Workers-Download-Proxy
2.绑定域名
这个在本系列文章中也写到过,不会请看《Cloudflare Workers》。
3.开始使用
当您访问您的网页时,将显示一个带有输入框和按钮的页面。按照以下步骤操作:
- 在输入框中输入要下载的文件链接。
- 若点击
下载
按钮,将会自动将您跳转下载。 - 若点击
获取下载链接
,则会在网页上输出代理后的下载链接。