一 nginx与请求行相关
① 关于请求行的变量
$request= '$request_method' SP '$request_uri' SP '$server_protocol'
++++++++++++++ "案例讲解" ++++++++++++++
说明: '请求行'中更多变量'细节',可以和'if'、'map'结合,更'细粒度'的控制
② nginx作为服务端接收关于method控制
1) 请求方法和'支持的协议版本'包含如下: -->'协议协商导致的'
[1] GET、HEAD、POST 它们都支持HTTP'1.0/1.1'
[2] PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH 它们'只支持HTTP1.1'
2) ngx_http_core_module.c看nginx支持'哪些method'
说明:'没有'限制,默认'全支持',与'RFC HTTP'协议跟随
3) 案例: 限制'除了'GET HEAD POST'外'的所有'谓词(method)' --> 只'允许'GET HEAD POST
limit_except GET POST {
deny all;
}
4) if和$request_method的'结合'限制'请求'方法 --> "作用域更广"
if ($request_method !~* 'GET|POST|HEAD|PUT|OPTIONS') {
return 404;
}
5) '302|302'重定向导致非'GET'请求变成'GET'请求,并且'request_body'丢失
推荐使用:'307临时'、'308永久'
③ nginx作为反向代理转发proxy相关的请求行
1) proxy_method --> 改变作为'反向代理角色nginx'的转发'请求'方法
细节点:
[1]、由于'http/1.0'只支持'GET、POST'请求方法
[2]、如需要将'origin_method'需要转换为'其它方法',需要配置'proxy_http_version 1.1'
2) 通过'location、proxy_pass、rewrite'改变作为'反向代理角色nginx'转发'request_uri'
注意点:
[1]、如果带proxy_pass带'attach_url',nginx会'解码后'进行透传,而不是'编码'原样透传
[2]、通过rewrite的'?'可以进行'args'参数调整
3) proxy_http_version --> 改变作为'反向代理角色nginx'的转发'请求'协议
4) proxy_next_upstream non_idempotent --> 关于'幂等请求方法'的
解释: 为什么默认'GET'请求会'重试与上游另外服务器'建立连接,'POST'不会
+++++++++++++++ "以下与缓存相关的" +++++++++++++++
1) proxy_cache_methods --> 哪些请求方法的响应'会被缓存'
2) proxy_cache_key --> 默认'没有指明'请求方法,所以不同请求方法都'命中' 'GET|HEAD'
3) proxy_cache_convert_head on
解读: 会将'HEAD请求'变成GET请求,并且缓存的是GET的response,而'不是'HEAD的response
补充: 这个配置'默认开启',即默认情况下会启用'HEAD方法转换为GET方法'进行缓存
④ 跨域涉及请求方法
预检请求是'浏览器'行为,所以F12可以直接看到,Chrome浏览器中type为'preflight'
⑤ 题外话
lvs配置persistence_timeout 参数导致lvs的rr负载不生效,负载不均衡