<div dir="ltr"><div><div><div>​​Hi,</div><div>I've discovered following strange issue with http_slice_module</div><div>If I have a named location for internal 302 redirect and caching one slice makes further request for whole object to brake upstream redirected request (missing Rage header, see frame 254 in the attached capture ​<div class="gmail_chip gmail_drive_chip" style="width:396px;height:18px;max-height:18px;background-color:rgb(245,245,245);padding:5px;color:rgb(34,34,34);font-family:arial;font-style:normal;font-weight:bold;font-size:13px;border:1px solid rgb(221,221,221);line-height:1"><a href="https://drive.google.com/a/ucdn.com/file/d/0ByZ2nt00gtJ2NmtqVUU3OVozNXM/view?usp=drive_web" target="_blank" style="display:inline-block;max-width:366px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none;padding:1px 0px;border:none"><img style="vertical-align: bottom; border: none;" src="https://ssl.gstatic.com/docs/doclist/images/icon_10_generic_list.png"> <span dir="ltr" style="color:rgb(17,85,204);text-decoration:none;vertical-align:bottom">slice_redirect_problem.pcapng</span></a><img src="//ssl.gstatic.com/ui/v1/icons/common/x_8px.png" style="opacity: 0.55; cursor: pointer; float: right; top: -1px; display: none;"></div>​ ).</div><div><br></div><div> If there is no cached slice everything is okey  (2nd capture​<div class="gmail_chip gmail_drive_chip" style="width:396px;height:18px;max-height:18px;background-color:rgb(245,245,245);padding:5px;color:rgb(34,34,34);font-family:arial;font-style:normal;font-weight:bold;font-size:13px;border:1px solid rgb(221,221,221);line-height:1"><a href="https://drive.google.com/a/ucdn.com/file/d/0ByZ2nt00gtJ2SUpnc2VVbzBKdWc/view?usp=drive_web" target="_blank" style="display:inline-block;max-width:366px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none;padding:1px 0px;border:none"><img style="vertical-align: bottom; border: none;" src="https://ssl.gstatic.com/docs/doclist/images/icon_10_generic_list.png"> <span dir="ltr" style="color:rgb(17,85,204);text-decoration:none;vertical-align:bottom">slice_redirect_no_problem.pcapng</span></a><img src="//ssl.gstatic.com/ui/v1/icons/common/x_8px.png" style="opacity: 0.55; cursor: pointer; float: right; top: -1px; display: none;"></div>​)</div><div><br></div><div>Problem appears in main branch and also  nginx/1.12 ... and may be in all versions</div><div><br></div><div>nginx version: nginx/1.13.2</div><div>built by gcc 4.9.2 (Debian 4.9.2-10) </div><div>configure arguments: --prefix=/home/george/run/nginx_hg --with-http_slice_module</div></div><div><br></div><div><br></div><div><br></div><div><br></div><div>nginx.conf</div><div>user cdnuser cdnuser;</div><div>worker_processes  1;</div><div><br></div><div>error_log  logs/error.log  debug;</div><div><br></div><div>events {<br></div><div>    worker_connections  1024;</div><div>}</div><div><br></div><div><br></div><div>http {</div><div>    include       mime.types;</div><div>    default_type  application/octet-stream;</div><div><br></div><div><br></div><div>    sendfile        on;</div><div>    tcp_nopush      on;</div><div>    </div><div>    proxy_cache_path /home/george/run/nginx_hg/cache/ keys_zone=zone_uid_default:4m levels=2:1 inactive=360d max_size=18329m;</div><div><br></div><div>    # our redirecting origin</div><div>    server {</div><div>        listen       8081;</div><div>                </div><div>        return 302 $scheme://127.0.0.1:8082$request_uri;</div><div>    }</div><div><br></div><div>    # our final origin</div><div>    server {</div><div>        listen       8082;</div><div>        add_header Cache-Control "max-age=3600";</div><div>        root /home/george/run/nginx_hg/root;</div><div>    }</div><div><br></div><div>    server {</div><div>        listen       8080;</div><div>        server_name  localhost;</div><div><br></div><div>        recursive_error_pages on;</div><div>        proxy_intercept_errors on;</div><div><br></div><div><br></div><div>        location / {</div><div>            slice             4m;</div><div>            proxy_cache       zone_uid_default;</div><div>            proxy_cache_key   $uri$is_args$args$slice_range;</div><div>            proxy_set_header  Range $slice_range;</div><div>          </div><div>            proxy_pass        <a href="http://localhost:8081">http://localhost:8081</a>;</div><div>            </div><div>            error_page 301 302 307 = @fetch_from_redirected_origin;</div><div>        }</div><div><br></div><div>        location @fetch_from_redirected_origin {</div><div>            slice   4m;</div><div><br></div><div>            internal;</div><div>            </div><div>            set $my_upstream_http_location $upstream_http_location;</div><div>            </div><div>            proxy_cache       zone_uid_default;</div><div>            proxy_cache_key   $uri$is_args$args$slice_range;</div><div>            proxy_set_header  Range $slice_range;</div><div>          </div><div>            proxy_pass        $my_upstream_http_location;</div><div>        }        </div><div>    }</div><div> }</div></div><div><br></div><div><br></div><div>How to reproduce:</div><div><br></div><div>1. Create some empty object in our emulated origin</div><div>mkdir /home/george/run/nginx_hg/root</div><div>dd if=/dev/zero of=/home/george/run/nginx_hg/root/some_object  bs=64M count=1</div><div> </div><div>2. Ask our caching proxy for one 4m slice, so it will be cached</div><div>curl -v -r 0-4194303 "<a href="http://127.0.0.1:8080/some_object">http://127.0.0.1:8080/some_object</a>" --header "Host: localhost" -o /dev/null</div><div> </div><div>3. See it really there</div><div>george@george ~/run/nginx_hg $ head   /home/george/run/nginx_hg/cache/81/c/00214df7041ea53dd335ed5b055bfc81 </div><div>Ļ:Y˩:Y��:YVʜ�r �  "593aa9cb-4000000"</div><div>KEY: /some_objectbytes=0-4194303</div><div>HTTP/1.1 206 Partial Content</div><div>Server: nginx/1.13.2</div><div>Date: Fri, 09 Jun 2017 14:16:20 GMT</div><div>Content-Type: application/octet-stream</div><div>Content-Length: 4194304</div><div>Last-Modified: Fri, 09 Jun 2017 13:59:39 GMT</div><div>Connection: close</div><div>ETag: "593aa9cb-4000000"</div><div><br></div><div>4. This time request the whole object </div><div>curl -v  "<a href="http://127.0.0.1:8080/some_object">http://127.0.0.1:8080/some_object</a>" --header "Host: localhost" -o /dev/null</div><div><br></div><div><br></div><div>​​<br></div></div>