Nginx 反向代理可以缓存 HTTP POST 请求页面吗?
本文节选自《Netkiller Web 手札》 作者:netkiller 网站:http://www.netkiller.cn
答案是可以!
因为nginx 使用 url 作为缓存的key ( Nginx 将url地址 md5后作为缓存的 key ),所以默认情况下 Nginx 只能处理 HTTP GET 缓存。
对于 HTTP POST 请求,提交数据放在HTTP Head 头部提交到服务器的, 提交前后URL始终不变,Nginx 无法区分相同网址两次请求的内容有变化。
但是我们可以自定义 缓存 key 例如: "$request_uri|$request_body" 我们将请求地址加上post内容作为缓存的key,这样nginx 便可以区分每次提交后的页面变化。
$request_body 用于缓存的例子:
proxy_cache_path /tmp/cache levels=1:2 keys_zone=netkiller:128m inactive=1m; server { listen 8080; server_name localhost; location / { try_files $uri @backend; } location @backend { proxy_pass http://node1.netkiller.cn:8080; proxy_cache netkiller; proxy_cache_methods POST; proxy_cache_key "$request_uri|$request_body"; proxy_buffers 8 32k; proxy_buffer_size 64k; proxy_cache_valid 5s; proxy_cache_use_stale updating; add_header X-Cached $upstream_cache_status; } }
2.3.12.11. $request_body - HTTP POST 数据
2.3.12.11.1. 用户日志
将 POST 数据记录到日志中
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" - "$request_body"';
注意:用户登录通常使用POST方式,所以记录POST数据到日志会带来安全问题,例如用户密码泄露。
Donations (打赏)
We accept PayPal through:
https://www.paypal.me/netkiller
Wechat (微信) / Alipay (支付宝) 打赏:
http://www.netkiller.cn/home/donations.html
作者相关文章:
Spring boot with ELK(Elasticsearch + Logstash + Kibana)
Spring boot with Elasticsearch 5.5.1
怎样将 MySQL 数据表导入到 Elasticsearch
Spring data 数据库建表(一对一,一对多,多对多)
Apache Sqoop 将mysql导入到Hadoop HDFS
CentOS 7.3 + Server JRE 1.8 + Hadoop-2.8.0
Spring boot with Schedule (启用/禁用)
Struts2 S2-046, S2-045 Firewall(漏洞防火墙)
转载请注明出处与作者声明,扫描二维码关注作者公众好,不定期更新文章