CORS 请求代理的实现

当我们请求第三方的资源时,常常收到跨域的限制,而我们有无法去修改对方的服务器设置来允许我们的访问,我们就可以使用代理请求服务器来帮我们实现跳过跨域限制。下面介绍几种常见的方法:

开源项目:CORS Anywhere

你可以使用像 CORS Anywhere 这样的服务,该服务会代理请求并添加必要的CORS头部。例如:

https://cors-anywhere.herokuapp.com/https://mmbiz.qpic.cn/...

除此之外,还有一些公共代理服务:

AllOrigins

另一个常用的公共代理服务,专门为CORS而设计。你可以使用如下格式来请求图片:

https://api.allorigins.win/raw?url=https://mmbiz.qpic.cn/...

CORS-Proxy

这是另一个可用的公共代理服务:

https://cors-proxy.htmldriven.com/?url=https://mmbiz.qpic.cn/...

注意:

公共代理服务存在不稳定性,部分代理可能会对请求速率进行限制。为了确保稳定性和安全性。最好使用部署CORS Anywhere,或者使用自己代理服务。 下面介绍两种自己可以轻松实现的代理服务方式

nginx 代理服务

通过 Nginx 配置一个通用的反向代理,它可以代理到任何目标域名并返回结果

配置如下:

server {
    listen      80;
    server_name your-domain.com;

    resolver 8.8.4.4;  # 添加 DNS 解析器,例如 Google 的公共 DNS

    location ~* "/(.*):/(.*)" {
        #增加响应头
        add_header Access-Control-Allow-Origin "*";
        add_header Access-Control-Allow-Methods "POST,GET,PUT,OPTIONS,DELETE";
        add_header Access-Control-Max-Age "3600";
        add_header Access-Control-Allow-Headers "Origin,X-Requested-With,Content-Type,Accept,Authorization,FOO";
        #如果为预检请求则直接响应204
        if ($request_method = OPTIONS ) {
            return 204;
        }
        #代理地址
        proxy_pass $1://$2/;
    }
}

配置好后只需要用下面的方式就可以拿到请求结果

http://your-domain.com/https://mmbiz.qpic.cn/...

后端代理服务

使用后端代为请求,将结果返回。如下面的django请求接口示例:

在你的 Django 应用中,创建一个视图函数来处理代理请求。

import requests
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods

@csrf_exempt
@require_http_methods(["GET", "OPTIONS"])  # 限制请求方法为GET和OPTIONS
def cors_proxy(request):
    target_url = request.GET.get('url')
    if not target_url:
        return HttpResponse("Missing 'url' parameter", status=400)

    # 处理预检请求(OPTIONS 请求)
    if request.method == 'OPTIONS':
        response = HttpResponse()
        response['Access-Control-Allow-Origin'] = '*'
        response['Access-Control-Allow-Methods'] = 'GET, OPTIONS'
        response['Access-Control-Allow-Headers'] = request.headers.get('Access-Control-Request-Headers', '*')
        return response

    try:
        # 发起 GET 请求到目标 URL
        response = requests.get(target_url)

        # 构造返回的响应
        proxy_response = HttpResponse(response.content, content_type=response.headers['Content-Type'])
        
        # 添加 CORS 头信息
        proxy_response['Access-Control-Allow-Origin'] = '*'
        proxy_response['Access-Control-Allow-Methods'] = 'GET, OPTIONS'
        proxy_response['Access-Control-Allow-Headers'] = '*'

        return proxy_response
    except requests.RequestException as e:
        return HttpResponse(f"Error fetching the URL: {e}", status=500)

在你的 urls.py 文件中,为这个视图添加路由。

from django.urls import path
from .views import cors_proxy

urlpatterns = [
    path('CorsProxy/', cors_proxy, name='cors_proxy'),
]

你可以通过以下 URL 访问这个代理接口:

http://127.0.0.1:8000/CorsProxy/?url=https://mmbiz.qpic.cn/...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值