2

I'm using try_files like this:

 http { server { error_log /var/log/nginx debug; listen 127.0.0.1:8080; location / { index off default_type application/octet-stream; try_files /files1$uri /files2/$uri /files3$uri; } } } 

In the error log, it's showing this:

*[error] 15077#0: 45399 rewrite or internal redirection cycle while internally redirecting to "/files1/files2/files3/path/to/my/image.png", client: 127.0.0.1, server: , request: "GET /path/to/my/image.png HTTP/1.1", host: "mydomain.com", referrer: "http://mydomain.com/folder"

Can anyone tell me why nginx is looking for /files1/files2/files3/path/to/my/image.png instead of /files1/path/to/my/image.png, /files2/path/to/my/image.png and /files3/path/to/my/image.png?

Thanks

3 Answers 3

7

http://nginx.org/r/try_files

syntax: try_files file ... uri; try_files file ... =code; 

The last parameter specifies return code or URI for internal redirect. In your case it's /files3$uri.

Perhaps you actually want this: try_files /files1$uri /files2$uri /files3$uri =404;

3

I suspect that nginx is essentially recursing, because the paths specified in try_files are matched by the location / block, which applies the try_files directive again. Try adding these location blocks to catch the paths which are being searched.

location /files1 {} location /files2 {} location /files3 {} 
4
  • You're right about a recursion but you're wrong about what caused it. Please, check the docs: nginx.org/r/try_files Checks the existence of files in the specified order, and uses the first found file for request processing; the processing is performed in the current context. Commented Jul 8, 2012 at 17:12
  • @VBart I'm not following why that means that /files1/files2/files3 is finally prepended? Commented Jul 8, 2012 at 17:26
  • 0. Assume that $uri is /. 1. Go to location / 2. /files1$uri results not found; 3. /files2/$uri results not found; 4. Redirecting to /files3$uri, because the last parameter in try_files is internal redirect; 5. Go to step 1 with the new $uri. Commented Jul 8, 2012 at 17:39
  • @VBart Ah, gotcha. Commented Jul 8, 2012 at 19:42
-3

The issue was solved by adding a root directive outside the location block:

 http { root /; location / { try_files files1$uri files2$uri files3$uri =404; } } 
2
  • 2
    No, it was solved because you correctly added the final fallback location. Commented Aug 16, 2013 at 4:30
  • You should NEVER put "root /" in your nginx config. You open up the possibility of someone accessing /etc/passwd or some other sensitive file. Commented May 29, 2017 at 15:45

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.