怎么给防外链的图片做代理访问呢?

浏览器里可以直接访问,但是在自己的域名下,用<img>显示就返回403
所以想做个代理访问,但是如下代码返回的内容不对,头大
求大佬们帮忙看下吧

http://abc.com/proxy?url=http://xxx.com/1.jpg
最好可以做到url的query传递要访问的url,就可以返回指定url的img或html
可以用python或nodeJs都行,最终会放在阿里云的云函数中运行

var http = require('http')
var fs = require('fs')

const proxy = (url) => {
  return new Promise(resolve => {
    http.get(url, res => {
      var result = ''
      res.setEncoding('binary')
      res.on('data', function(data) {
        result += data
      })
      res.on('end', function() {
        resolve(result)
      })
    })
  })
}

exports.handler = async (req, res, context) => {
   console.log(req.queries.url)

   res.setHeader("content-type", "image/jpg")
   return res.send(await proxy(req.queries.url))
}

image.png

阅读 2.1k
1 个回答

自己解决啦~~~
以下代码支持html和img的代理
放在阿里云函数(运行环境 Node.JS 12.x HTTP 函数)里就能用

var http = require('http')

exports.handler = async (req, res) => {
  console.log(req.queries.url)

  const proxy = (url) => {
    return new Promise(resolve => {
      http.get(url, res => {
        var result = []
        res.on('data', data => result.push(data))
        res.on('end', () => resolve(Buffer.concat(result)))
      })
    })
  }

  // 写的比较简单,有需要的话,自己做更复杂的判断吧
  if (req.queries.url.includes('.jpg')) {
    res.setHeader('content-type', 'image/jpg')
  }

  return res.send(await proxy(req.queries.url))
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题