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