如何阻止JQuery自动将HTTP请求重定向至HTTPS?
解决WebView中jQuery HTTP请求被强制重定向到HTTPS的问题
首先得明确重定向的来源——可能是服务器端配置了HTTP转HTTPS规则、WebView的HSTS安全策略自动升级,或者页面脚本触发的跳转。针对不同情况,你可以试试下面这些方案:
1. 拦截WebView的重定向请求
通过自定义WebViewClient拦截所有跳转请求,把HTTPS地址强制改回HTTP:
webView.setWebViewClient(new WebViewClient() { // 拦截页面跳转类的重定向 @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { String targetUrl = request.getUrl().toString(); if (targetUrl.startsWith("https://your-server-domain.com")) { String httpUrl = targetUrl.replaceFirst("https://", "http://"); view.loadUrl(httpUrl); return true; // 表示已处理该请求 } return super.shouldOverrideUrlLoading(view, request); } // 拦截AJAX这类资源请求的重定向 @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { String targetUrl = request.getUrl().toString(); if (targetUrl.startsWith("https://your-server-domain.com")) { try { // 手动构造HTTP请求绕过重定向 URL httpUrl = new URL(targetUrl.replaceFirst("https://", "http://")); HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection(); // 复制原请求的方法和请求头 conn.setRequestMethod(request.getMethod()); for (Map.Entry<String, String> header : request.getRequestHeaders().entrySet()) { conn.setRequestProperty(header.getKey(), header.getValue()); } // 返回构造的响应 return new WebResourceResponse( conn.getContentType().split(";")[0], conn.getContentEncoding(), conn.getInputStream() ); } catch (IOException e) { e.printStackTrace(); } } return super.shouldInterceptRequest(view, request); } });
2. 禁用WebView的HSTS策略
如果是HSTS(HTTP严格传输安全)导致的强制跳转,在Android O及以上版本可以直接关闭:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { webView.getSettings().setHttpsState(WebSettings.HttpsState.DISABLED); }
低版本可以尝试清除WebView的HSTS缓存,或者通过反射修改相关设置(注意兼容性)。
3. 调整jQuery AJAX的请求配置
确保AJAX请求不自动升级协议,并且禁用重定向跟随:
$.ajax({ url: 'http://your-server-domain.com/api/your-endpoint', type: 'GET', // 或POST等对应方法 // 禁用自动跟随重定向 xhrFields: { withCredentials: false }, beforeSend: function(xhr) { // 告诉服务器不要强制升级到HTTPS xhr.setRequestHeader('Upgrade-Insecure-Requests', '0'); }, success: function(response) { // 处理返回数据 }, error: function(xhr, status, err) { console.error('请求失败:', err); } });
4. 检查并调整服务器配置(如果可行)
如果能接触到服务器,暂时关闭HTTP到HTTPS的重定向规则:
- Nginx:注释掉
rewrite ^(.*)$ https://$host$1 permanent;这类重写规则 - Apache:注释掉
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]规则
额外确认项
- 确保你已经正确开启了混合内容允许:
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
- 可以用Chrome DevTools远程调试WebView,查看Network面板的请求流程,定位具体是哪一步触发的重定向。
内容的提问来源于stack exchange,提问作者Jake StBu
相关产品推荐
相关产品推荐

