Quick question about try_files

Hello, all.

nginx version: nginx/0.7.67

This works great to look first in fast local storage, and then fall back
to
slower storage for older archives:

location ^~ /providers/ {
  error_page 404 = @archives;
  log_not_found off;
}
location @archives {
  rewrite "/providers/(.*)" /archives/providers/$1 last;
}

I thought I could tidy this up by doing the following, but it doesn’t
work:

location ^~ /providers/ {
  try_files $uri /archives$uri @mongrel_app;
}

Anyone see why? Thanks in advance.

Aaron

Hello!

On Fri, Jan 07, 2011 at 11:41:06AM -0800, Aaron Starr wrote:

}
location @archives {
  rewrite "/providers/(.*)" /archives/providers/$1 last;
}

This rewrites to /archives/… and searches for location again.
Request will be handled elsewhere, and it’s not known how it will
be handled from the config snippet provided.

I thought I could tidy this up by doing the following, but it doesn’t work:

location ^~ /providers/ {
  try_files $uri /archives$uri @mongrel_app;
}

Anyone see why? Thanks in advance.

This should work as long as root for archives matches one for
providers. But won’t work as long as you have something like

location ^~ /archives/ {
    root /path/to/another/storage;
}

in your config.

Maxim D.

Maxim,

Thanks for your quick reply!

I should have included that in both cases, the default handler is this:

location / {
  try_files $uri $uri/index.html @mongrel_app;
}

And, there is no /archives/ handler. So, here are the snippets that I
think
are relevant. Working:

location ^~ /providers/ {
  error_page 404 = @archives;
  log_not_found off;
}
location @archives {
  rewrite "/providers/(.*)" /archives/providers/$1 last;
}
location / {
  try_files $uri $uri/index.html @mongrel_app;
}

Not working:

location ^~ /providers/ {
  try_files $uri /archives$uri @mongrel_app;
}
location / {
  try_files $uri $uri/index.html @mongrel_app;
}

Also, I should mention that it in the not-working case, the behavior is
that
it will correctly find the file in /providers/… but if the file is
moved
to /archives/providers/…, it will no longer find it.

I’ve put all the location directives here: http://pastie.org/1438414

Thanks, again,

Aaron

Maxim,

Again, thanks for your help. I created the debug log and found a
permissions
problem.

I had dismissed permissions as a possible reason for the behavior,
because
it was working fine with the one configuration (I promise!). But,
whatever.
A couple of permissions changes and voila! Everything works as expected.

I sincerely appreciate your help.

Aaron

Hello!

On Fri, Jan 07, 2011 at 01:27:32PM -0800, Aaron Starr wrote:

And, there is no /archives/ handler. So, here are the snippets that I think
try_files $uri $uri/index.html @mongrel_app;
}

Not working:

location ^~ /providers/ {
  try_files $uri /archives$uri @mongrel_app;
}
location / {
  try_files $uri $uri/index.html @mongrel_app;
}

This should work (and works here without problems, just tested in
both 0.9.3 and 0.7.67). Note though that the second form (with
try_files) won’t work with directories.

Also, I should mention that it in the not-working case, the behavior is that
it will correctly find the file in /providers/… but if the file is moved
to /archives/providers/…, it will no longer find it.

I’ve put all the location directives here: http://pastie.org/1438414

Could you please provide debug log for working and non-working
cases? See Debugging | NGINX for basic
instructions.

Maxim D.