【笔记】深入理解Nginx-worker-06-3.6.2 获取URI和参数

获取URI和参数

请求的所有信息(如方法、URI、协议版本号和头部等)都可以在传入的ngx_http_request_t类型参数r中取得.

在对一个用户请求行进行解析时,可以得到下列4类信息:

  1. 方法名
  2. method的类型是ngx_uint_t(无符号整型),它是Nginx忽略大小写等情形时解析完用户请求后得到的方法类型,其取值范围如下所示。

    当需要了解用户请求中的HTTP方法时,应该使用r->method这个整型成员与以上15个宏进行比较,这样速度是最快的(如果使用method_name成员与字符串做比较,那么效率会差很多),大部分情况下推荐使用这种方式。

    除此之外,还可以用method_name取得用户请求中的方法名字符串,或者联合request_start与method_end指针取得方法名。method_name是ngx_str_t类型,按照3.2.2节中介绍的方法使用即可。

    request_start与method_end的用法也很简单,其中request_start指向用户请求的首地址,同时也是方法名的地址,method_end指向方法名的最后一个字符(注意,这点与其他xxx_end指针不同)。获取方法名时可以从request_start开始向后遍历,直到地址与method_end相同为止,这段内存存储着方法名。

    Nginx中对内存的控制相当严格,为了避免不必要的内存开销,许多需要用到的成员都不是重新分配内存后存储的,而是直接指向用户请求中的相应地址。例如,method_name.data、request_start这两个指针实际指向的都是同一个地址。而且,因为它们是简单的内存指针,不是指向字符串的指针,所以,在大部分情况下,都不能将这些u_char *指针当做字符串使用。

  3. URI
  4. ngx_str_t类型的uri成员指向用户请求中的URI。同理,u_char *类型的uri_start和uri_end也与request_start、method_end的用法相似,唯一不同的是,method_end指向方法名的最后一个字符,而uri_end指向URI结束后的下一个地址,也就是最后一个字符的下一个字符地址(HTTP框架的行为),这是大部分u_char *类型指针对”xxx_start”和”xxx_end”变量的用法。

  5. URL参数
  6. arg指向用户请求中的URL参数。

    args_start指向URL参数的起始地址,配合uri_end使用也可以获得URL参数。

  7. 协议版本
  8. http_protocol指向用户请求中HTTP的起始地址

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部