PHP below server root not served

Francis Daly francis at
Fri Jan 10 09:36:44 UTC 2014

On Fri, Jan 10, 2014 at 02:07:34PM +1100, nano wrote:
> On 10/01/2014 7:58 AM, Francis Daly wrote:

Hi there,

just some quick responses to parts...

> It was my mistake assuming Apache logic[0] would be used.

Yes -- in general, in Apache, the configuration that applies to a request
can come from multiple places. In nginx, it comes from one location,
plus the surrounding contexts.

> I mean to say, even though location 4 contains its own config, the 
> config from location 2 is globally used, thus rendering location 4 
> requests broken.

Per nginx logic, location 4 is used for every request for which it is the
"best match". It just happens that there are no such requests. It's the
administrator's job to spot this "brokenness".

> I still find this confusing: why has this move not broken the generic 
> location ~\.php$ block, which now comes after the location 
> /phpmyadmin/(.*\.php)$ block, rendering root requests ( 
> broken? The inverse breaks the /phpmyadmin/(.*\.php)$ config.

What request do you make?

What (top-level) location{}s do you have?

Which one location will be chosen for the request?

Try those questions with each of the requests you care about, and see
if you can see why it works.

> >When nginx chooses the one location to use for a request, it chooses
> >the one top-level location{} block to use. Within that block, if there
> >are further choices to make, they are independent.
> More clarification! Your explanations are really helpful. How will 
> having  ~\.php$ nested inside ^~ /phpmyadmin affect the main site 
> (server root / WordPress administration of PHP? (I think 
> you may have already answered this with your upcoming example.)

The same questions apply:

What request do you make?

What (top-level) location{}s do you have?

Which one location will be chosen for the request?

> >The suggestion is along the lines of:
> >
> >   location ^~ /phpmyadmin/ {
> >     location ~ \.php$ {

At this point, you could instead use "location ~
^/phpmyadmin/.*\.php$". It will match exactly the same requests --
can you see why?

Depending on the rest of your setup, there may be a reason to use this.

> So, PHP directives, such as fastcgi_param SCRIPT_FILENAME, contained 
> within the ~ \.php$ location nested inside the ^~ /phpmyadmin/ location 
> will not apply to the rest of the site -- only to /phpmyadmin? The 
> subsequent location ~ \.php$ applies to the rest of the site?

Each http request is independent.

Each nginx request is handled in one location.

For each request, only the configuration in, or inherited into, the one
location, applies.

This may seem repetitive; that's because it is. Until you understand
that point, you will not understand nginx configuration.

Good luck with it,

Francis Daly        francis at

More information about the nginx mailing list