Use try_files and still get errors 404
Maxim Dounin
mdounin at mdounin.ru
Tue Jun 14 00:44:32 MSD 2011
Hello!
On Mon, Jun 13, 2011 at 05:10:19AM -0400, iko wrote:
> Hello,
>
> recently I migrate one of domains, I manage, to use try_files directive
> instead of several "if" blocks and rewrites. New server description is
> like this:
>
> server {
> listen X.X.X.X;
> server_name example.com *.example.com;
>
> index index.php;
> root /www/example.com/www/root;
>
> try_files $uri $uri/ /index.php$is_args$args;
>
> location ~* \.(jpg|jpeg|gif|png|ico|swf)$ {
> gzip off;
> expires 7d;
> }
> location ~* \.(js|css)$ {
> expires 7d;
> }
> location ~ \.php$ {
> fastcgi_pass upstreanphp;
> fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
> fastcgi_intercept_errors on;
> fastcgi_read_timeout 120;
> fastcgi_next_upstream error timeout invalid_header;
> include fastcgi_params;
> }
> }
>
> Strange thing (for me) is if I try some URL like
> http://example.com/path/to/non/existing/file.jpg (or any other extension
> from location checks) I receive error 404. Is this normal behavior ? I
> expect index.php to be open. I've tried to put try_files in location / {
> } , but effect is the same ? Do I have to put try_files in every
> location block ? Or this is some kind of bug ?
Directive try_files isn't inhereted from previous levels, and not
expected to. You've defined it at server level (which isn't
allowed per documentation, btw, but happens to work - this is
probably a bug, indeed) and this results in try_files being used
in an implicit location.
There are no try_files in other locations though, and the result
you see is expected. If you want try_files to be in other
locations - you have to place it there too.
Maxim Dounin
More information about the nginx
mailing list