Nginx中$request_method和$server_protocol可直接用于自定义日志,分别记录HTTP方法(如GET、POST)和协议版本(如HTTP/1.1、HTTP/2),无需额外配置;二者需置于双引号内以避免解析错误,拆开使用更利于结构化分析。

Nginx 自定义日志格式中,请求方法(如 GET、POST)和协议版本(如 HTTP/1.1、HTTP/2) 是通过内置变量 $request_method 和 $server_protocol 直接获取的,它们属于请求阶段可用的基础变量,无需额外配置即可使用。
请求方法怎么记录
用 $request_method 变量,它返回标准 HTTP 方法名:
- 示例值:
GET、POST、PUT、DELETE、HEAD - 在
log_format中直接写入,比如:log_format custom '$request_method $request_uri $server_protocol ...';
协议版本怎么记录
用 $server_protocol 变量,它反映客户端实际使用的协议:
- 示例值:
HTTP/1.0、HTTP/1.1、HTTP/2、HTTP/3(需启用 QUIC) - 注意:该值来自请求行,不是服务器协商结果,真实可靠
推荐组合写法(含可读性与实用性)
在 http 块中定义时,可这样组织关键字段:
log_format detailed '$remote_addr - [$time_local] '
'"$request_method $request_uri $server_protocol" '
'$status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';
access_log /var/log/nginx/access.log detailed;-
$request_method和$server_protocol必须放在双引号内(因协议含/,空格分隔,否则日志解析易错) -
$request_uri比$uri更完整(含查询参数),配合方法和协议能还原原始请求行
补充说明
- 若需完整请求行(等效于
$request),直接用$request即可,它已包含方法、URI 和协议三部分,例如:"GET /api/v1?x=1 HTTP/1.1" - 但拆开写(
$request_method $request_uri $server_protocol)更利于后续日志分析工具做结构化解析(如按方法聚合、按协议统计占比)
不需要启用特殊模块或修改编译选项,这两个变量在所有标准 Nginx 版本中均默认支持。


















