Glide加载重定向链接图片失败提示重定向循环如何解决
前置排查
先确认链接本身不存在循环重定向:可以把链接放到浏览器中打开,看是否能正常加载图片。如果浏览器也无法加载,说明是链接本身的问题,无需调整Glide配置。
如果浏览器可以正常加载,说明是Glide的请求配置不符合目标站点的要求,大概率是防盗链限制或者重定向次数不足,按下方方案处理即可。
问题根因
Glide默认内置的HttpUrlFetcher最多仅支持5次重定向,当目标链接的重定向次数超过该阈值、或者存在循环重定向逻辑时,就会抛出In re-direct loop异常。
解决方案
方案1:替换Glide网络栈为OkHttp(推荐)
OkHttp对重定向的处理更成熟,默认支持20次重定向,适配绝大多数场景,集成步骤如下:
- 引入Glide的OkHttp3集成依赖(版本和你项目中的Glide版本保持一致)
dependencies { implementation "com.github.bumptech.glide:glide:你的Glide版本号" implementation "com.github.bumptech.glide:okhttp3-integration:你的Glide版本号" kapt "com.github.bumptech.glide:compiler:你的Glide版本号" }
- 自定义OkHttpClient配置重定向规则,注册到Glide
@GlideModule class CustomGlideModule : AppGlideModule() { override fun registerComponents(context: Context, glide: Glide, registry: Registry) { val okHttpClient = OkHttpClient.Builder() .followRedirects(true) .followSslRedirects(true) // 可自行调整最大重定向次数 .callTimeout(15, TimeUnit.SECONDS) .build() registry.replace( GlideUrl::class.java, InputStream::class.java, OkHttpUrlLoader.Factory(okHttpClient) ) } }
配置完成后原有加载代码无需修改即可正常使用。
方案2:调整默认HttpUrlFetcher的重定向次数阈值
如果不想引入OkHttp,可以自定义HttpUrlFetcher修改默认的重定向次数上限:
- 自定义重写
HttpUrlFetcher,修改最大重定向次数:
public class CustomHttpUrlFetcher extends HttpUrlFetcher { // 将默认的5次调整为10次,可按需修改 private static final int MAX_REDIRECTS = 10; public CustomHttpUrlFetcher(GlideUrl glideUrl, int timeout) { super(glideUrl, timeout); } @Override protected InputStream loadDataWithRedirects(URL url, int redirects, URL lastUrl, Map<String, String> headers) throws IOException { if (redirects >= MAX_REDIRECTS) { throw new HttpException("Too many (> " + MAX_REDIRECTS + ") redirects!"); } return super.loadDataWithRedirects(url, redirects, lastUrl, headers); } }
- 自定义Glide模块注册自定义的Fetcher即可。
方案3:添加防盗链请求头
如果调整重定向次数后仍然报错,说明目标站点有防盗链限制,返回的重定向地址循环跳转,你可以给GlideUrl加上对应的请求头再加载:
GlideUrl glideUrl = new GlideUrl(url, new LazyHeaders.Builder() .addHeader("User-Agent", "和浏览器一致的User-Agent") .addHeader("Referer", "目标站点的域名,比如https://www.washingtonpost.com/") .build()); Glide.with(this.context).load(glideUrl).centerCrop().into(imageView);
方案4:提前解析重定向最终URL
如果是服务端可控的场景,可以提前请求拿到重定向后的最终图片地址,再传给Glide加载,避免每次加载都走重定向流程,性能最优。
内容的提问来源于stack exchange,提问作者FranKs
相关产品推荐
相关产品推荐

