转载至:微信公众号:可道技术
需求说明
使用OpenResty(Nginx+Lua)做CDN组件,遇到一个需求,需要把源站响应的302跳转处理掉,就是自动在CDN把302消化掉而把200响应内容发送给用户,简单点说就是不让302走到请求客户端那边。
解决方案—— error_page
感谢方腾同学的指点。 这里已一个优酷视频的302跳转为例,直接上代码:
server { listen 80; server_name k.youku.com; resolver 10.16.20.3; proxy_intercept_errors on; recursive_error_pages on; location / { proxy_pass http://k.youku.com; proxy_set_header Host k.youku.com; error_page 302 = @error_page_302; } location ~ /proxyto/([^/]+)(.*) { proxy_pass http://$1$2$is_args$query_string; error_page 302 = @error_page_302; } location @error_page_302 { rewrite_by_lua ' local _, _, upstream_http_location = string.find(ngx.var.upstream_http_location, "^http:/(.*)$") ngx.header["cnkedao"] = "/proxyto" .. upstream_http_location ngx.exec("/proxyto" .. upstream_http_location); '; } access_log logs/yk.log; }
使用Nginx内置的error_page方法捕获302状态码,然后把请求指定到location @error_page_302去处理。
里面的处理逻辑大概就是把302的Header中的Location段的http URL取出来,然后再使用ngx.exec发起请求获取文件内容。