Why doesn't nginx like my $args?

I have a WordPress site located at mysite.com/blog, the files of which are located in /var/www/mysite/wordpress. Why, when I visit mysite.com/blog/test, does my nested location block only get hit if I remove $args from try_files?

server {
    server_name mysite.com;

    location /blog {
        alias /var/www/mysite/wordpress;
        try_files $uri $uri/ /blog/index.php$args;

        location ~ \.php {
            # This is only reached if I remove $args from try_files
            return 401; # For testing purposes 
        }
    }
}

Here is the associated error in the log:

"/usr/share/nginx/html/index.php" failed (2: No such file or directory)


Solution 1:

Because you forgot the ? between index.php and $args. The convenience variable $is_args contains a ? when necessary, and is empty when there was no query string.

try_files $uri $uri/ /blog/index.php$is_args$args;

Of course, with WordPress you do not need to use $args at all, as it gets the query string elsewhere:

try_files $uri $uri/ /blog/index.php;

is sufficient.

It appears you are using try_files with alias directive. That's a long standing bug in nginx, use root directive instead.