摘要: Nginx 反向代理可以緩存 HTTP POST 請求頁面嗎? 2017-09-05 景峯 Netkiller 本文節選自《Netkiller Web 手札》 作者:netkiller 網站:http://www.netkiller.cn 答案是可以! 因為nginx 使用 url 作為緩存的key ( Nginx 將url地址 md5后作為緩存的 key ),所以默認情況下 Nginx 只能處理 HTTP GET 緩存。
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數據到日志會帶來安全問題,例如用戶密碼泄露。
