在嵌入式UIWebView中指定HTTP referer

时间:2011-10-27 08:17:46

标签: iphone ios http-headers mobile-safari http-referer

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

2 个答案:

答案 0 :(得分:21)

使用referer

设置- setValue:forHTTPHeaderField:
NSMutableURLRequest* request = ...;
[request setValue:@"https://myapp.com" forHTTPHeaderField: @"Referer"];

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

  

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

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

您可以create one手动拨打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;
    }
}

答案 1 :(得分:0)

我自己没有使用过,但看起来NSURLProtocol是批准的拦截和修改网址请求的方法。这是一个教程:http://www.raywenderlich.com/59982/nsurlprotocol-tutorial

我正在使用您向NSMutableURLRequest转发请求的解决方案,但由于没有记录这是一个可变请求,因此Apple可能会在将来使用不可变对象。