Deno 使用 Nodejs 思路实现反向代理解决前端跨域问题以及将 http 转为 https

发布于 1周前 作者 ionicwang 来自 nodejs/Nestjs

Deno 使用 Nodejs 思路实现反向代理解决前端跨域问题以及将 http 转为 https

前端在调用别人 api 时经常遇到跨域或者 https 无法调用 http 的问题,通过反代即可解决。 deno.com 提供免费的 NodeJS 环境,在其官网后台新建应用,在 playground 粘贴代码:

import { serve } from "https://deno.land/[email protected]/http/server.ts"
serve(async (req: Request) => {
  const url = new URL(req.url)
  const targetUrl = url.href.replace(`${url.origin}/`, '')
  let urlObj: any
  try {
    urlObj = new URL(targetUrl)
  } catch (e) {
    console.error(e.message)
  }
  if (['http:', 'https:'].indexOf(urlObj?.protocol) > -1) {
    let res = await fetch(targetUrl, {
      headers: req.headers,
      method: req.method,
      body: req.body,
    })
    let headers = {}
    res.headers.forEach((value, key) => {
      headers[key] = value
    })
    if ('*' !== headers['Access-Control-Allow-Origin']?.trim()
      && '*' !== headers['access-control-allow-origin']?.trim()) {
      headers['Access-Control-Allow-Origin'] = '*'
    }
    return new Response(res.body, { headers, status: res.status })
  }
  return new Response(
    `Usage: ${url.origin}/https://deno.com/deploy/docs/pricing-and-limits`)
})

14 回复

可别拿人家测试环境当云函数使了。。。


不滥用,厂家是支持的……

本身就是一个云函数环境呀,有额度的

比如说,反代百度可以正常打开首页,但点击搜索后,跳转时就把百度的域名给弄丢了。这个怎么搞?

deno 到底是禁止反代,还是禁止破墙的代理?

#4
这个需要把 html 代码里的所有 src 再反代一下,需要处理源码

#5
deno 哪个官方文档提到禁止反代?

谢谢,偶尔急用还是很不错

#8
当你们公司后端给你测试接口不开跨域时

谢谢,可用。这小玩意挺有意思

前端构建工具自带有 proxy 啊

https://deno.com/deploy/docs/fair-use-policy 倒也不是说禁止,不建议当 proxy 用

在 Deno 中实现反向代理以解决前端跨域问题,并将 HTTP 请求转为 HTTPS 请求,可以利用 Deno.listenDeno.connect 来创建服务器和客户端连接,结合 fetch API 来进行请求转发。以下是一个简单的实现示例:

import { listen, connect, serveTls } from "https://deno.land/std@0.193.0/http/server.ts";

// 反向代理中间件
async function proxyMiddleware(req: Request): Promise<Response> {
  const url = new URL(req.url);
  url.protocol = "https:";
  const res = await fetch(url.toString(), {
    method: req.method,
    headers: req.headers,
    body: req.body,
  });
  return new Response(res.body, {
    status: res.status,
    statusText: res.statusText,
    headers: res.headers,
  });
}

// 启动 HTTPS 服务器并添加反向代理
const httpsOptions = {
  certFile: "./path/to/cert.pem",
  keyFile: "./path/to/key.pem",
};

serveTls(httpsOptions, async (req: Request) => {
  return await proxyMiddleware(req);
}).then((server) => {
  console.log(`HTTPS server running at https://localhost:${server.port}`);
});

在上述代码中,proxyMiddleware 函数将请求从 HTTP 转为 HTTPS 并转发到目标服务器。serveTls 函数用于启动 HTTPS 服务器,并处理所有传入的请求,通过 proxyMiddleware 函数进行反向代理。

请确保你已经生成了 SSL 证书(cert.pemkey.pem),并将路径正确配置在 httpsOptions 中。这样,你就可以通过 HTTPS 访问你的服务器,并且所有跨域请求都会通过反向代理解决。

回到顶部