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数据到日志会带来安全问题,例如用户密码泄露。

原文发布于微信公众号 - Netkiller(netkiller-ebook)

原文发表时间:2017-09-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玩转JavaEE

Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享

小伙伴们好久不见!最近略忙,博客写的有点少,嗯,要加把劲。OK,今天给大家带来一个JavaWeb中常用的架构搭建,即Nginx+Tomcat搭建服务集群,然后通...

3826
来自专栏闵开慧

eclipse启动时和开发时优化

1 eclipse.ini参数优化 -startup plugins/org.eclipse.equinox.launcher_1.3.201.v201610...

3657
来自专栏前端侠2.0

Angular中,模块加载的几种方法 原

好处:这种方式有利于初始减少加载体积 , 不需要在app.module.ts中,主动去引入相应的模块(它们自然不会打包到AppModule中去)。

322
来自专栏测试开发架构之路

Tomcat入门

1、JavaWeb概念 Java web,是用java技术来解决相关web互联网领域的技术的总称。web包括:web服务器和web客户端两部分。 java在...

4237
来自专栏菩提树下的杨过

Silverlight:xap包(或本地缓存)下载版本更新的解决思路

在SL开发中,通常会将项目按模块分成多个xap实现按需下载,但是由于浏览器的缓存,就算某个模块代码修改过并重新发布到服务器,如果这个xap已经在浏览器缓存中,实...

1757
来自专栏PHP技术

THINKPHP总结

1.设置runtime不缓存 define(“NO_CACHE_RUNTIME”,TRUE); 2.设置文件内容空格 define(“STRIP_RUNTIME...

3196
来自专栏LIN_ZONE

Laravel使用Form(转载)

laravel到了5.1.*以上版本,便没有了illuminate/html类库的支持,

442
来自专栏青玉伏案

设计模式(六):控制台中的“命令模式”(Command Pattern)

今天的博客中就来系统的整理一下“命令模式”。说到命令模式,我就想起了控制台(Console)中的命令。无论是Windows操作系统(cmd.exe)还是Linu...

1829
来自专栏行者常至

Hibernate之HelloWorld

412
来自专栏GreenLeaves

Oracle 数据库实例和数据库

本文参考自oracle数据库实例,数据库的理解,纯属读书笔记,用于加深记忆。 先看Tom关于这二者的解释: 1、数据库 物理操作系统文件或磁盘的集合(我觉得可以...

18610

扫描关注云+社区