Questions about proxy_pass and internal directives
Reinis Rozitis
r at roze.lv
Fri Oct 19 01:32:38 UTC 2012
> I use "internal" directive to block direct access to anything
> "/foo/bar/,,,", which seems to be what nginx is doing. At the same time, I
> proxy_pass the request to the backend application server to check for
> permissions. If success, the backend server sends a 'X-Accel-Redirect'
> header back to nginx to serve the file.
> I may need to rethink my design here. Ideally, I want users who request
> "/foo/bar/sth" in their browsers get served by nginx with the file
> "/foo/bar/sth/sth.html", while letting the backend application server
> control the access to the file.
Well then you are doing it generally right, the only tricky part to
innitially understand is using different location blocks - one for the
proxy_pass and one for the protected files.
The example is shown also in the XSendfile wiki page.
- To really protect the files while not necessary you should keep them out
of the default webroot.
- First you define the location you will be using as URLs on your website
(there is no need for such directories or files to actually exist as all the
requests will be sent to the backend for it to decide what to do next).
location /foo/bar {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
}
- Second you define the location what will be used in the X-Accel-Redirect
header sent from the backend server.
location /protected/ {
internal;
root /data/files;
#or alias /data/files/; - in case you want to leave the '/protected'
out of your physical data path.
}
1. Now if you request mysite.com/foo/bar/sth.html the request is sent the to
backend ( http://127.0.0.1:8080/foo/bar/sth.html )
2. If the download is allowed (whatever logic the application implements)
backend should respond with X-Accel-Redirect: /protected/foo/bar/sth.html
( you can change the directory tree or even the resulting file names as you
wish / the only requirement is to leave the defined internal path (in this
case '/protected').
3. Depending on what you used ('root' or 'alias') in the protected location
block a file from /data/files/protected/foo/bar/sth.html or
/data/files/foo/bar/sth.html will be served by nginx.
4 .Even if people discover the backend url or the X-Accel-Redirect header
there is no way for them to acess the files directly since
mysite.com/protected/foo/bar/sth.html wont work for them.
rr
More information about the nginx
mailing list