Question about nested locations / PHP

Not sure if this is the right place to post this; apologies in advance
if it is!

I’m having a bit of trouble with nested locations and PHP. I have a
setup where I want all PHP files to go through fastcgi, and have an
expiry of epoch. However, one particular PHP file is used to generate
CSS stylesheets, and I want this file to have an expiry of 30 days. My
current code looks like this:

location ~ .php$
{
location ~ /css.php
{
expires 30d;
add_header Pragma public;
add_header Cache-Control “public”;
}

expires epoch

// Fastcgi stuff…
}

I’ve tried various combinations (having the nested location at the end,
etc) but all that happens is the css.php file doesn’t get sent through
the fastcgi process, and the raw PHP code is sent to the client. I’ve
messed up somewhere, and I’m new to nginx (just migrated from Apache) so
if someone could point out my error / give a quick explanation of how
nested locations work, it would be ideal!

Thanks in advance!

Adrian

On Fri, 2012-03-09 at 22:12 +0000, Adrian H. wrote:

location ~ /css.php

You don’t need nested locations. This should work:

location = /css.php {
expires 30d;
add_header Pragma public;
add_header Cache-Control “public”;
include fastcgi_params;
fastcgi_pass …
}

location ~ .php$ {
expires epoch
include fastcgi_params;
fastcgi_pass …
}

Information on the order of processing can be found here:

http://nginx.org/en/docs/http/request_processing.html#simple_php_site_configuration
http://wiki.nginx.org/HttpCoreModule#location

Regards,
Cliff

Thanks. Could it be done with nested locations at all? Do I really have
to include all the PHP config for each block?

-Adrian

On Sun, 2012-03-11 at 01:15 +0400, Maxim D. wrote:

And, as Cliff already suggested, you don’t really need nested
locations here, it’s better to define exact location for
/css.php, i.e. something like this:

location = /css.php {
    expires 30d;
    fastcgi_pass ...
    ...
}

I was concerned that using an absolute location might not be general
enough, since I seem to see a lot of PHP apps that use URLS like
“/css.php/these/are/args”, which might cause this location to be skipped
if css.php happened to use that scheme.

Regards,
Cliff

Hello!

On Fri, Mar 09, 2012 at 10:12:45PM +0000, Adrian H. wrote:

{
}

I’ve tried various combinations (having the nested location at
the end, etc) but all that happens is the css.php file doesn’t
get sent through the fastcgi process, and the raw PHP code is
sent to the client. I’ve messed up somewhere, and I’m new to
nginx (just migrated from Apache) so if someone could point out
my error / give a quick explanation of how nested locations
work, it would be ideal!

You have to define the “fastcgi_pass” directive in both locations
for this to work.

And, as Cliff already suggested, you don’t really need nested
locations here, it’s better to define exact location for
/css.php, i.e. something like this:

location = /css.php {
    expires 30d;
    fastcgi_pass ...
    ...
}

location ~ \.php$ {
    expires epoch;
    fastcgi_pass ...
    ...
}

Maxim D.