gojs.net.http.Request

请求对象,通常无需初始化,可以直接在请求相关的边缘脚本中调用。

方法和属性

  1. // 请求ID
  2. req.id
  3. // 服务信息,包括id等属性
  4. req.server
  5. // 节点信息,包括id等属性
  6. req.node
  7. // 请求ID,同 req.id
  8. req.requestId
  9. // 请求完整URL
  10. req.url
  11. // 请求完整URL,同 req.url
  12. req.requestURL
  13. // 请求路径,不带参数
  14. req.path
  15. // 请求路径,不带参数,同 req.path
  16. req.requestPath
  17. // 请求URI,带参数,可以在发送请求之前修改
  18. req.uri
  19. // 请求URI,带参数,可以在发送请求之前修改,同 req.uri
  20. req.requestURI
  21. // 请求主机名,带端口
  22. req.host
  23. // 请求客户端地址,可以通过X-Real-IP等HTTP Header获取
  24. req.remoteAddr
  25. // 请求客户端地址,直接连接节点的地址,有可能是别的代理服务
  26. req.rawRemoteAddr
  27. // 请求客户端端口号
  28. req.remotePort
  29. // 请求方法
  30. req.method
  31. // 请求发送的内容长度
  32. req.contentLength
  33. // 请求的内容编码
  34. req.transferEncoding
  35. // 请求的协议,比如HTTP/1.0
  36. req.proto
  37. // 请求的协议的主版本,比如1.0版本的主版本就是1
  38. req.protoMajor
  39. // 请求的协议的小版本,比如1.0版本的小版本为0
  40. req.protoMinor
  41. // 请求Cookie值
  42. req.cookie(name)
  43. // 请求的Header,结构为:{ name1: [value1, value2], name2: [value3], ... }
  44. req.header
  45. // 设置请求Header
  46. // 值可以是一个字符串,也可以是一组字符串
  47. req.setHeader(name, value)
  48. req.setHeader(name, values)
  49. // 删除某个请求Header
  50. req.deleteHeader(name)
  51. // 设置请求相关属性
  52. req.setAttr(name, value)
  53. // 设置请求相关变量值
  54. req.setVar(name, value)
  55. // 格式化一组变量值,具体支持的变量,请参考备注1
  56. // 比如 req.format("${requestId}: ${requestPath}")
  57. req.format(varString)
  58. // 设置当前请求脚本执行完毕,不再执行后续的其他脚本
  59. req.done()
  60. // 允许请求,标记当前请求不启用WAF检查
  61. // 需要在请求初始化时调用
  62. req.allow()
  63. // 关闭当前请求所在连接
  64. // 这种情况下,不仅不会执行当前请求,同连接的其他请求也会一并拒绝执行
  65. req.close()

备注:

示例

根据请求路径来判断是否跳过WAF检查

  1. // 其中 /news 换成你自己要检查的路径
  2. if (req.path == "/news") {
  3. req.allow()
  4. }

根据请求路径来决定是否阻止访问

  1. // 这里我们阻止以 /. 开头的路径,比如 /.svn 之类的都将被阻止
  2. if (req.path.startsWith("/.")) {
  3. // 断开当前连接,是对恶意请求比较常见的处理方式
  4. req.close()
  5. }

打印用户所在国家或地区

  1. if (req.path == "/country") {
  2. resp.send(200, "You are from " + req.format("${geo.country.name}"))
  3. return
  4. }

其中 ${geo.country.name} 是请求中可以使用的变量,更多支持的变量可以看这里

这样当用户访问 /country 时就可以打印出国家名,类似于:

  1. You are from 中国