<div dir="ltr"><div dir="ltr"><div dir="ltr"><div># HG changeset patch</div><div># User Sangdeuk Kwon <<a href="mailto:dark264sh@gmail.com">dark264sh@gmail.com</a>></div><div># Date 1557288704 -32400</div><div>#      Wed May 08 13:11:44 2019 +0900</div><div># Node ID c4e1be885640a8302dcbf97162b3cbdc21710a84</div><div># Parent  16a1adadf43751f59257ba419f6bacd530dd19d3</div><div>reset r->cache->valid_sec for following the redirect</div><div><br></div><div>this config:</div><div><br></div><div>http {</div><div>    proxy_intercept_errors on;</div><div><br></div><div>    proxy_cache_path /cache0 levels=1:2 keys_zone=STATIC:10m max_size=10g inactive=60m use_temp_path=off;</div><div>    proxy_cache_key "$host$uri";</div><div>    proxy_cache STATIC;</div><div><br></div><div>    upstream up_servers {</div><div>        server <a href="http://127.0.0.2:8080">127.0.0.2:8080</a>;</div><div>    }</div><div><br></div><div>    server {</div><div>        listen <a href="http://127.0.0.1:8000">127.0.0.1:8000</a>;</div><div><br></div><div>        location / {</div><div>            proxy_pass <a href="http://up_servers">http://up_servers</a>;</div><div>            proxy_set_header Host $host;</div><div>            proxy_http_version 1.1;</div><div>            add_header X-Cached $upstream_cache_status;</div><div><br></div><div>            proxy_intercept_errors on;</div><div>            error_page 301 302 303 307 308 = @handle_redirects;</div><div>        }</div><div><br></div><div>        location @handle_redirects {</div><div>            set $orig_loc $upstream_http_location;</div><div>            proxy_pass $orig_loc;</div><div>        }</div><div>    }</div><div>}</div><div><br></div><div><div>When origin server does not send cache time header (max-age or expires),</div><div>nginx can follow the redirect with location header.</div><div>But, if origin server sends cache time header,</div><div>nginx can't follow the redirect and nginx send 302 response without location header to a client.</div><div>So the client also can't follow the redirect because of absenting location header.</div><div><br></div><div>diff -r 16a1adadf437 -r c4e1be885640 src/http/ngx_http_upstream.c</div><div>--- a/src/http/ngx_http_upstream.c  Wed Apr 24 16:38:56 2019 +0300</div><div>+++ b/src/http/ngx_http_upstream.c  Wed May 08 13:11:44 2019 +0900</div><div>@@ -2645,6 +2645,15 @@</div><div>                     if (valid) {</div><div>                         r->cache->error = status;</div><div>                     }</div><div>+</div><div>+                    if (status == NGX_HTTP_MOVED_PERMANENTLY</div><div>+                        || status == NGX_HTTP_MOVED_TEMPORARILY</div><div>+                        || status == NGX_HTTP_SEE_OTHER</div><div>+                        || status == NGX_HTTP_TEMPORARY_REDIRECT</div><div>+                        || status == NGX_HTTP_PERMANENT_REDIRECT)</div><div>+                    {</div><div>+                        r->cache->valid_sec = 0;</div><div>+                    }</div><div>                 }</div><div><br></div><div>                 ngx_http_file_cache_free(r->cache, u->pipe->temp_file);</div></div></div></div></div>