在我的应用中,我允许用户在嵌入式UIWebView中打开外部页面。我是否可以设置与该请求一起发送的referer标头?当用户打开这些外部页面时,我希望我的应用程序能够获得“信誉”。
答案 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可能会在将来使用不可变对象。