php and locations with regex (round 2)

Grzegorz Nosek grzegorz.nosek at gmail.com
Wed Oct 24 12:31:48 MSD 2007


2007/10/23, Igor Sysoev <is at rambler-co.ru>:
> You may use:
>
>       location ~ \.php$ {
>           fastcgi_pass   ...
>           ...
>       }
>
>       location ~ ^/(app1|app2)/ {
>           root    ...
>           ...
>       }

This gets ugly quickly if you decide one day to e.g. pass different
php files to different fastcgi backends (running under different users
or something). Also, if I'm right, errors while serving php pages come
from the first location, so requests for /app1/nonexistent.php and
/app1/nonexistent.jpg may result in different error handling.

>
> It's better do not use "if".
> Try to route request via locations only.
> If you want to pass non-existent files to FastCGI/proxy it's better to use:
>
>       location / {
>           root   ...
>           error_page 404  =  @fallback;
>       }
>
>       location @fallback {
>           fastcgi_pass   ...
>           ...
>       }
>

Why? Because the configuration inside if blocks isn't really merged
with its parent config but overwritten (AFAIK, that's what vanilla
nginx does; my patchset fixes that, at least for cases I care about)?
Or is there another reason? Routing dynamic content via error pages
seems hackish to me -- an if block inside location looks more natural
(again, IMHO).

Oh, and BTW -- given that my nginx patchset merges the configs, is
there any (other) reason to disallow certain directives inside if
blocks (those allowed in location, of course)?

BTW2, if anybody besides me is using the patchset, please upgrade :)

Best regards,
 Grzegorz Nosek





More information about the nginx mailing list