You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何在URLSession跟随重定向时自动添加反向代理

在Swift中处理带反向代理的多步重定向下载

要实现每一步重定向都给请求加上反向代理,完全可以通过URLSession的重定向代理回调手动修改请求,具体实现如下:

核心实现思路

利用URLSessionTaskDelegate协议中的urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)方法——每次请求触发重定向时,系统都会调用这个方法,你可以在这里修改重定向目标URL,替换为带反向代理的地址后,让请求继续执行。

代码示例

class DownloadProxyHandler: NSObject, URLSessionTaskDelegate {
    func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) {
        // 取出重定向的目标URL
        guard let originalRedirectUrl = request.url else {
            // 无法获取URL时取消重定向
            completionHandler(nil)
            return
        }
        
        // 构造带反向代理的URL
        var proxyComponents = URLComponents()
        proxyComponents.scheme = "https"
        proxyComponents.host = "reverse-proxy"
        // 按需求将原URL的完整内容(去掉scheme前缀)作为代理路径的一部分
        let originalUrlPath = originalRedirectUrl.absoluteString.replacingOccurrences(of: "\(originalRedirectUrl.scheme)://", with: "")
        proxyComponents.path = "/\(originalUrlPath)"
        
        guard let proxyUrl = proxyComponents.url else {
            completionHandler(nil)
            return
        }
        
        // 构造新请求,替换为代理URL
        var proxyRequest = request
        proxyRequest.url = proxyUrl
        
        // 继续执行修改后的重定向请求
        completionHandler(proxyRequest)
    }
}

// 使用示例
let proxyHandler = DownloadProxyHandler()
let session = URLSession(configuration: .default, delegate: proxyHandler, delegateQueue: .main)
let originalRequest = URLRequest(url: URL(string: "https://初始下载地址")!)
let downloadTask = session.downloadTask(with: originalRequest)
downloadTask.resume()

关键注意点

  • 默认情况下URLSession允许重定向,无需额外配置;如果手动设置了configuration.allowsRedirects = false,则不会触发重定向回调。
  • 必须处理URL构造失败的边界情况,避免因无效URL导致请求中断。
  • 如果反向代理需要特定请求头(比如认证信息),可以在构造proxyRequest时通过setValue(_:forHTTPHeaderField:)添加。

内容的提问来源于stack exchange,提问作者Ch'en Meng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:33:22