NodeJS 将带有ProxyPreserveHost的Apache反向代理转换为适用于Cloudflare工作人员的Javascript

ovfsdjhp  于 2023-02-03  发布在  Node.js
关注(0)|答案(1)|浏览(142)
    • bounty将在5天后过期**。回答此问题可获得+200声望奖励。Alex希望引起更多人对此问题的关注。

我们希望将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;
}

但我得到了一个拒绝许可的响应。

k5ifujac

k5ifujac1#

它现在起作用了...

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
    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":"www.example.com"}})
    return response;
}

我相信它在第一次尝试时就犯了根本性的错误,甚至可能没有部署工人:-)
我还发现,在工人的快速编辑页面上有一个错误日志控制台,这很有帮助。

  • 但是 *

这并没有完全回答问题的那一部分,即如何在worker中模拟ProxyPreserveHost On,因此我将其保留为开放式。

相关问题