网页重定向

本文介绍了HTTP请求方法,包括GET、HEAD等,并详细阐述了网页重定向的原理和实现方式,涉及到DNS解析过程、iptables重定向、自定义DNS服务器以及Goahead框架中的重定向函数。此外,还讨论了如何判断浏览器请求与应用程序请求,以及网络连接状态的判断与处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:第一次打开网页,跳往固定页面。

涉及技术:

1、包解析。区分网页请求的包。

有以下知识可以参考:

请求方法是请求一定的Web页面的程序或用于特定的URL。可选用下列几种:
GET: 请求指定的页面信息,并返回实体主体。
HEAD: 只请求页面的首部。
POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。
PUT: 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE: 请求服务器删除指定的页面。
OPTIONS: 允许客户端查看服务器的性能。
TRACE: 请求服务器在响应中的实体主体部分返回所得到的内容。
PATCH: 实体中包含一个表,表中说明与该URI所表示的原内容的区别。
MOVE: 请求服务器将指定的页面移至另一个网络地址。
COPY: 请求服务器将指定的页面拷贝至另一个网络地址。
LINK: 请求服务器建立链接关系。
UNLINK: 断开链接关系。
WRAPPED: 允许客户端发送经过封装的请求。
Extension-mothed:在不改动协议的前提下,可增加另外的方法。
比如:
GET /index.html HTTP/1.1
Accept: text/plain /*纯ASCII码文本文件*/
Accept: text/html /*HTML文本文件*/
User-Agent:Mozilla/4.5(WinNT)
说明浏览器使用Get方法请求文档/index.html。浏览器则只允许接收纯ASCII码文本文件和HTML文本文件,其使用的引擎是Mozilla/4.5(Netscape)。

当服务器响应时,其状态行的信息为HTTP的版本号,状态码,及解释状态码的简单说明。现将5类状态码详细列出:
① 客户方错误
100  继续
101  交换协议
② 成功
200  OK
201  已创建
202  接收
203  非认证信息
204  无内容
205  重置内容
206  部分内容
③ 重定向
300  多路选择
301  永久转移
302  暂时转移
303  参见其它
304  未修改(Not Modified)
305  使用代理
④ 客户方错误
400  错误请求(Bad Request)
401  未认证
402  需要付费
403  禁止(Forbidden)
404  未找到(Not Found)
405  方法不允许
406  不接受
407  需要代理认证
408  请求超时
409  冲突
410  失败
411  需要长度
412  条件失败
413  请求实体太大
414  请求URI太长
415  不支持媒体类型
⑤ 服务器错误
500  服务器内部错误
501  未实现(Not Implemented)
502  网关失败
504  网关超时
505 HTTP版本不支持

telnet www.fudan.edu.cn 80
HEAD / HTTP/1.1
host:www.fudan.edu.cn /*本行为输入内容*/
HTTP/1.1 501 Method Not Implemented
Date: Web, 01 Nov 2000 07:12:29 GMT /*当前的日期/时间*/
Server: Apache/1.3.12 (Unix) /*Web服务器信息*/
Allow: GET, HEAD, OPTION, TRACE /*支持的方法类型*/
Connection: close
Connect-Type: Text/html; charset=iso-8859-1/*连接的媒体类型*/

<!DOCTYPE HTML PUBLIG "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>501 Method
Not Implemented</TITLE>
</HEAD><BODY>
<H1>Method Not Implemented</H1>
head to /inde
x.html not supported.<P>
Invalid method in request head / htp/1.1<P>
<HR>
<ADDRESS>
Apache/1.3.12 Server at www.fudan.edu.cn Port 80</ADDRESS>
</BODY></HTML>
关于实体头部的内容还可以有:
Last Modified :请求文档的最近修改时间。
Expires :请求文档的过期时间。
Connect-length:文档数据的长度。
WWW-authenricate:通知客户端需要的认证信息。
Connect-encoding :说明有无使用压缩技术。
Transfer-encoding :说明采用的编码变换类型。

****

即当GET包时候,可以设置一个标签,表示是网页请求。

在static int websParseFirst(webs_t wp, char_t *text)函数里可以增加:

else
    {
      wp->flags |= WEBS_GET_REQUEST;
    }


2、iptables.

本来想直接将网页请求的包转发到固定IP,但是没有实现,所以还是要采用前辈们的方法

将53端口DNS的数据直接转发到54号端口自己建立的DNS:

iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-port 54

具体iptables详解见前面的文章。


3、DNS

DNS处于IP分层结构的应用层,是一种应用层协议,DNS协议数据单元封装在UDP数据报文中,DNS服务器端使用公用端口号为53(使用UDP协议0x11

DNS解析过程如下:

(1)      当客户机提出查询请求时,首先在本地计算机的缓存中查找,如果在本地无法查询信息,则将查询请求发给DNS服务器

(2)      首先客户机将域名查询请求发送到本地DNS服务器,当本地DNS服务器接到查询后,首先在该服务器管理的区域的记录中查找,如果找到该记录,则进行此记录进行解析,如果没有区域信息可以满足查询要求,服务器在本地缓存中查找

(3)      如果本地服务器不能在本地找到客户机查询的信息,将客户机请求发送到根域名DNS服务器

(4)      根域名服务器负责解析客户机请求的根域名部分,它将包含下一级域名信息的DNS服务器地址地址返回给客户机的DNS服务器地址

(5)      客户机的DNS服务器利用根域名服务器解析的地址访问下一级DNS服务器,得到再下一级域名的DNS服务器地址

(6)      按照上述递归方法逐级接近查询目标,最后在有目标域名的DNS服务器上找到相应IP地址信息

(7)      客户机的本地DNS服务器将递归查询结构返回客户机

(8)      客户机利用从本地DNS服务器查询得到的IP访问目标主机,就完成了一个解析过程

(9)      同时客户机本地DNS服务器更新其缓存表,客户机也更新期缓存表,方便以后查询


自己增加一个简单DNS服务器,如:

InitSimpleDNS();

static void *simple_dns_proc(void *handle)

get_answer_ip(&answer_addr);

dns_rcv_query(&sockaddr);

dns_build_answer(header, &answer_len, &answer_addr);

dns_send_answer((void*)header, answer_len, &sockaddr, &answer_addr);


4、goahead.其中goahead有 websRedirect()既是重定向函数。

if( TRUE == wp->b_redirect )
    {
      memset(redirect_page, 0, 128);
      memset(redirect_page_temp, 0, 128);
      memcpy(redirect_page_temp,REDIRECT_PAGE, sizeof(REDIRECT_PAGE));
      sprintf(redirect_page, "http://%s", redirect_page_temp);
      websRedirect(wp, redirect_page);  
      return 1;
    }

goahead的内容后面会转发一篇文章讨论。


5、connection

如何判断连接上网络了,调用iptables脚本也是一个关键的点,可以自己研究。

然后连上网络调用

redirect_rules_proc(E_WWAN_CONNECTED);

其函数如下:

static void redirect_rules_proc(uint8 connect_status)

if(connect_status == E_WWAN_CONNECTED)
  {
    stream = popen( "add_redirect_rules.sh", "w" );
  }
  else if(connect_status == E_WWAN_DISCONNECTED)
  {
    stream = popen( "del_redirect_rules.sh", "w" );
  }

说明:

FILE * popen ( const char * command , const char * type )
      popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。这个进程必须由 pclose() 函数关闭,而不是 fclose() 函数。
      pclose() 函数关闭标准 I/O 流,等待命令执行结束,然后返回 shell 的终止状态。
      如果 shell 不能被执行,则 pclose() 返回的终止状态与 shell 已执行 exit 一样。


6、如何判断是浏览器还是应用程序发出的网页GET请求

判断两次即可,websRedirect()后在判断GET请求,相符合即表示重定向完成。

如下:

  if(!strnicmp(str_tmp, REDIRECT_PAGE, sizeof(REDIRECT_PAGE)

wp->b_redirect = FALSE;


7、本机IP和特定网页IP不重定向

 if(strnicmp(str_tmp, websHost, host_len) && \
                 strnicmp(str_tmp, wp->ifaddr, strlen(wp->ifaddr))

wp->b_redirect = FALSE;


感觉还是挺复杂,其中最精妙的想法,感觉是那个simpleDns,可惜是别人的想法。

如果是自己完成的,有那样的技术,就感觉很不错了。

继续努力吧。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值