Nginx proxy redirect to another URI
Use the X-Accel-Redirect
header in combination with a special Nginx location
to have Nginx proxy the remote file.
Here is the location
to add to your Nginx configuration:
# Proxy download location ~* ^/internal_redirect/(.*?)/(.*) { # Do not allow people to mess with this location directly # Only internal redirects are allowed internal; # Location-specific logging access_log logs/internal_redirect.access.log main; error_log logs/internal_redirect.error.log warn; # Extract download url from the request set $download_uri $2; set $download_host $1; # Compose download url set $download_url http://$download_host/$download_uri; # Set download request headers proxy_set_header Host $download_host; proxy_set_header Authorization ''; # The next two lines could be used if your storage # backend does not support Content-Disposition # headers used to specify file name browsers use # when save content to the disk proxy_hide_header Content-Disposition; add_header Content-Disposition 'attachment; filename="$args"'; # Do not touch local disks when proxying # content to clients proxy_max_temp_file_size 0; # Download the file and send it to client proxy_pass $download_url;}
Now you just have to set the X-Accel-Redirect
header in your responses to Nginx:
# This header will ask nginx to download a file # from http://some.site.com/secret/url.ext and send it to userX-Accel-Redirect: /internal_redirect/some.site.com/secret/url.ext# This header will ask nginx to download a file # from http://blah.com/secret/url and send it to user as cool.pdfX-Accel-Redirect: /internal_redirect/blah.com/secret/url?cool.pdf
The full solution was found here. I suggest reading it before implementing.