【问题标题】:WKWebView does not actually follow redirectsWKWebView 实际上并不遵循重定向
【发布时间】:2021-04-23 10:23:10
【问题描述】:

我在 macOS 中有一个简单的WKWebView。访问没有 www 的页面然后重定向到子域 www 时,我遇到了重定向问题。

据我所知,我只需要允许导航请求,webView 应该自己处理所有事情。但重定向从未真正发生过。 webView 最终进入重定向循环,一遍又一遍地调用didReceiveServerRedirectForProvisionalNavigation:,直到最终以Error Domain=NSURLErrorDomain Code=-1007 "too many HTTP redirects" 失败

Safari,其他浏览器和客户端确实成功了,这让我相信这不是服务器问题。 此外,当我直接输入重定向到的地址时,它确实可以正常工作。

我实现WKNavigationDelegate协议如下:

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    if ([navigationAction navigationType] == WKNavigationTypeOther) {
        if ([[[[navigationAction request] URL] host] isEqualToString:[[[self webView] URL] host]]) {
            decisionHandler(WKNavigationActionPolicyAllow);
            NSLog(@"allowed");
            return;
        }
    
        decisionHandler(WKNavigationActionPolicyCancel);
        NSLog(@"cancelled: %@", [navigationAction request]);
    }
    else {
        decisionHandler(WKNavigationActionPolicyAllow);
    }
}

- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
    NSLog(@"provisional navigation started");
}

- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation; {
    NSLog(@"provisional navigation received redirect");
}

在我使用WKNavigationActionPolicyAllow 回答后,我希望 webView 接受并实际遵循重定向。

当我执行请求时,会发生以下情况:

  1. decidePolicyForNavigationAction:用于主域名
  2. 我回复允许
  3. didStartProvisionalNavigation:
  4. decidePolicyForNavigationAction:用于子域重定向
  5. 我回复允许
  6. didReceiveServerRedirectForProvisionalNavigation:
  7. 回到 6。

我必须以某种方式“提交”重定向还是自己手动执行? 有什么想法还是我完全错过了什么?

【问题讨论】:

    标签: objective-c macos webkit wkwebview http-redirect


    【解决方案1】:

    我太傻了。真的。愚蠢到令人尴尬。 我的桌子现在有我的脸了。

    我的原始代码被删减以进行概述,直到我删除了我的问题...

    我正在处理主机名不在 URL 中的特殊用例。我通过它的 IP 连接到一个多站点 Web 服务器并相应地设置 Host 标头以获取所需的页面。

    重定向时,我复制请求,相应地设置标头并重新发送请求。你猜怎么了?通过发送相同的Host: 标头来响应重定向将导致另一个重定向。呸。

    我将把它留在这里供公众娱乐一两天

    【讨论】:

      猜你喜欢
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 2020-10-04
      • 2017-04-09
      相关资源
      最近更新 更多