我们希望将Apache代理转换为边缘上的Cloudflare工作者:
我们使用保留主机配置:
ProxyPreserveHost On
ProxyPass /blog http://wordpress.example.com/blog
ProxyPassReverse /blog http://wordpress.example.com/blog
所以example.com/blog
打开博客。
我们尝试了以下脚本:
export default {
async fetch(request, env) {
var url = new URL(request.url);
// set hostname to the place we're proxying requests from
url.protocol = "http"
url.hostname = "wordpress.example.com"
let response = await fetch(url, {"headers":{"Host":"example.com"}}))
return response;
}
}
但它会导致500服务器错误
我看起来主机头不能是overwritten in the fetch API?这也适用于这样的服务器端代码或只在浏览器/AJAX请求?
我尝试了另一种方法:
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
const url = new URL(request.url);
url.protocol = 'http';
url.hostname = '<IP of the wordpress server>';
console.log(request);
var req = new Request(request.url, {
method: request.method,
headers: request.headers,
redirect: 'manual' // let browser handle redirects
});
req.headers.set('Host', 'www.example.com');
const data = await fetch(url.toString(),req);
return data;
}
但我得到了一个拒绝许可的响应。
1条答案
按热度按时间k5ifujac1#
它现在起作用了...
我相信它在第一次尝试时就犯了根本性的错误,甚至可能没有部署工人:-)
我还发现,在工人的快速编辑页面上有一个错误日志控制台,这很有帮助。
这并没有完全回答问题的那一部分,即如何在worker中模拟
ProxyPreserveHost On
,因此我将其保留为开放式。