上一篇
安卓如何域名重定向
- 行业动态
- 2025-04-23
- 2063
在安卓应用中实现域名重定向,可通过网络请求库(如OkHttp)拦截响应,检测301/302状态码后,修改请求Host或直接替换目标URL,或在WebView中通过shouldOverrideUrlLoading方法处理跳转
服务器端配置域名重定向
在安卓应用中,域名重定向通常由服务器端配置实现,当用户访问旧域名时,服务器返回 HTTP 状态码(如 301/302)并跳转到新域名。
Nginx 配置示例
旧域名 | 新域名 | 配置方式 |
---|---|---|
old.example.com | new.example.com | 在 Nginx 配置文件中添加:server {<br> listen 80;<br> server_name old.example.com;<br> return 301 $scheme://new.example.com$request_uri;<br>} |
Apache 配置示例
旧域名 | 新域名 | 配置方式 |
---|---|---|
old.example.com | new.example.com | 在 .htaccess 文件中添加:RewriteEngine On<br>RewriteRule ^(.)$ https://new.example.com/$1 [R=301,L] |
安卓应用内处理域名重定向
若需在客户端(安卓应用)内处理域名重定向(WebView 加载时),可通过以下方式实现:
WebView 拦截并重定向
webView.setWebViewClient(new WebViewClient() { @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { // 检测旧域名并替换为新域名 if (request.isForMainFrame()) { String url = request.getUrl().toString(); if (url.contains("old.example.com")) { String newUrl = url.replace("old.example.com", "new.example.com"); view.loadUrl(newUrl); } } } });
OkHttp 拦截器重定向
OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(chain -> { Request request = chain.request(); HttpUrl url = request.url(); if (url.host().equals("old.example.com")) { // 构造新 URL HttpUrl newUrl = url.newBuilder() .host("new.example.com") .build(); request = request.newBuilder() .url(newUrl) .build(); } return chain.proceed(request); }) .build();
本地 Hosts 文件强制重定向(仅测试用)
在安卓设备上修改 Hosts 文件,将旧域名解析到新域名的 IP 地址:
- 获取设备 Root 权限或使用 Magisk 等工具。
- 编辑
/system/etc/hosts
文件,添加:456.789.0 old.example.com
(需确保
456.789.0
是新域名的 IP)
常见问题与解决方案
问题 | 解决方案 |
---|---|
重定向后 SSL 报错 | 确保新域名已配置有效 SSL 证书,且重定向规则保留协议(HTTP → HTTPS)。 |
应用内部分接口未跳转 | 检查代码中硬编码的旧域名,统一替换为动态获取的配置或新域名。 |
浏览器访问正常,应用异常 | 可能是应用内缓存未更新,尝试清除应用缓存或强制重启应用。 |
相关问题与解答
问题 1:如何区分 301(永久)和 302(临时)重定向?
解答:
- 301 重定向:表示资源永久移动,浏览器会缓存重定向结果,后续直接访问新地址。
- 302 重定向:表示临时跳转,每次访问仍需重新发起请求到旧地址。
- 服务器配置差异:
- Nginx:
return 301
(永久) vsreturn 302
(临时)。 - Apache:
[R=301,L]
(永久) vs[R=302,L]
(临时)。
- Nginx:
问题 2:如何验证域名重定向是否生效?
解答:
- 使用 curl:
curl -I http://old.example.com
检查响应头是否包含
Location: https://new.example.com
。 - 浏览器开发者工具:
- 打开开发者工具(F12)→ Network 面板。
- 访问旧域名,查看请求是否跳转到新域名。
- 安卓应用内调试:
在 WebView 或 OkHttp 日志中打印实际请求的 URL