I'm using try_files like this:

http {
  server {
    error_log /var/log/nginx debug;
    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:, 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?




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;


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 {}
  • 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. – VBart Jul 8 '12 at 17:12
  • @VBart I'm not following why that means that /files1/files2/files3 is finally prepended? – mgorven Jul 8 '12 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. – VBart Jul 8 '12 at 17:39
  • @VBart Ah, gotcha. – mgorven Jul 8 '12 at 19:42

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
    No, it was solved because you correctly added the final fallback location. – Mahmoud Al-Qudsi Aug 16 '13 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. – mhost May 29 '17 at 15:45

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.