在嵌入式UIWebView中指定HTTP referer

Edw*_*ale 14 iphone http-referer mobile-safari http-headers ios

在我的应用程序中,我允许用户在嵌入式UIWebView中打开外部页面.我是否可以设置与该请求一起发送的referer标头?当用户打开这些外部页面时,我希望我的应用程序获得"信誉".

Jan*_*ano 21

使用- setValue:forHTTPHeaderField设置referer :

NSMutableURLRequest* request = ...;
[request setValue:@"https://myapp.com" forHTTPHeaderField: @"Referer"];
Run Code Online (Sandbox Code Playgroud)

但请注意,根据HTTP RFC,您不应该这样做,因为您的应用程序无法使用URI进行寻址:

如果从没有自己的URI的源(例如来自用户键盘的输入)获取Request-URI,则不得发送Referer字段.

...除非您使用绑定到应用程序的自定义协议(myapp://blah.com/blah).

您可以创建一个并调用loadRequest:手动或拦截用户发出的正常请求.

- (BOOL) webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType) navigationType 
{
    NSDictionary *headers = [request allHTTPHeaderFields];
    BOOL hasReferer = [headers objectForKey:@"Referer"]!=nil;
    if (hasReferer) {
        // .. is this my referer?
        return YES;
    } else {
        // relaunch with a modified request
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            dispatch_async(dispatch_get_main_queue(), ^{
                NSURL *url = [request URL];
                NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
                [request setHTTPMethod:@"GET"];
                [request setValue:@"https://whatever.com" forHTTPHeaderField: @"Referer"];
                [self.webView loadRequest:request];
            });
        });
        return NO;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 事实证明,我可以将来自`UIWebViewDelegate`的请求可靠地转换为`NSMutableURLRequest`.上面建议的请求替换解决方案是通过在完整浏览器中重新打开iframe来打破页面中的iframe. (3认同)