4. 注意事项
4.1 HTTP请求头HOST字段设置
标准的HTTP协议中服务端会将HTTP请求头HOST字段的值作为请求的域名信息进行解析。使用HTTPDNS后,您可能需要将HTTP请求URL中的HOST字段替换为HTTPDNS解析获得的IP,这时标准的网络库会将您的IP赋值给HTTP请求头的HOST字段,进而导致服务端的解析异常(服务端认可的是您的域名信息,而非IP信息)。为了解决这个问题,您可以主动设置HTTP请求HOST字段的值,如:
- NSString *originalUrl = @"http://www.aliyun.com/";
- NSURL* url = [NSURL URLWithString:originalUrl];
- NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url];
- // 同步接口获取IP
- NSString* ip = [httpdns getIpByHostAsync:url.host];
- if (ip) {
- // 通过HTTPDNS获取IP成功,进行URL替换和HOST头设置
- NSRange hostFirstRange = [originalUrl rangeOfString: url.host];
- if (NSNotFound != hostFirstRange.location) {
- NSString* newUrl = [originalUrl stringByReplacingCharactersInRange:hostFirstRange withString:ip];
- request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:newUrl]];
- // 设置请求HOST字段
- [request setValue:url.host forHTTPHeaderField:@"host"];
- }
- }
4.2 COOKIE字段
部分网络库支持COOKIE的自动存储管理,当您使用HTTPDNS进行IP URL请求时,部分网络库会将您URL中的IP信息作为COOKIE对应的域名信息进行存储管理(而非HTTP请求头HOST字段信息),进而造成COOKIE管理与使用上的困扰,因此您需要关闭COOKIE的自动管理功能(默认关闭)。
4.3 HTTPS/WebView/SNI场景
4.4 代理情况下的使用
当存在中间HTTP代理时,客户端发起的请求中请求行会使用绝对路径的URL,在您开启HTTPDNS并采用IP URL进行访问时,中间代理将识别您的IP信息并将其作为真实访问的HOST信息传递给目标服务器,这时目标服务器将无法处理这类无真实HOST信息的HTTP请求。移动网关提供了
X-Online-Host的私有协议字段来解决这个问题,比如:
- 目标URL:http://www.aliyun.com/product/oss/
- 通过HTTPDNS解析出来的www.aliyun.com的IP:1.1.1.1
- 代理:10.0.0.172:80
- 您的HTTP请求头:
- GET http://1.1.1.1/product/oss/ HTTP/1.1 # 通过代理发起的HTTP请求头,请求行是一个绝对路径
- Host: www.aliyun.com # 这个Header会被代理网关忽略,代理网关会使用请求行绝对路径中的host字段作为源站的host,即1.1.1.1
- X-Online-Host: www.aliyun.com # 这个Header就是移动网关为了传递真实Host添加的私有头部,源站需要配置识别该私有头部以获取真实的Host信息
同样您可以通过下述方法进行
X-Online-Host请求头域的设置,并在服务端设置对该私有头域的解析。
- [request setValue:url.host forHTTPHeaderField:@"X-Online-Host"];
在绝大多数场景下,我们建议您在代理模式下关闭HTTPDNS功能。