PHP via FastCGI in / and sub-directory location w/ different roots

Francis Daly francis at
Fri Nov 8 22:24:03 UTC 2013

On Thu, Nov 07, 2013 at 11:37:22AM +0100, Thilo-Alexander Ginkel wrote:

Hi there,

> I am currently somewhat stuck getting the following setup up and running:

I've tried to replicate what you're doing, and it turns out I'm unable
to work out what exactly you're doing.

> I have one PHP web application residing in /usr/share/a that I'd like to
> have available at /. This works as expected.


> I have a second PHP web app residing in /var/www/b/public, that I'd like to
> have available at /b.


So, when you ask for the url /b/file.txt, which file on the filesystem
do you want nginx to return? (And: which file does nginx return?)

And when you ask for the url /b/env.php, which file on the filesystem
do you want your fastcgi server to process?

(I would have expected the answers to these questions to be similar,
but using the config you provided, they look different. I suspect I'm
doing something wrong.)

>   location ~ ^/b/.*\.php$ {
>     rewrite         ^/b(/.*) $1 break;
>     root  /var/www/b/public;

The rewrite and root here look a bit odd to me; but if it works, it works.

> fastcgi_param   REQUEST_URI                 $uri?$args;

Is there a reason that isn't just "$request_uri" at the end?

Maybe it's a default value from a distribution of nginx?

> I included the rewrite in location ~ ^/b/.*\.php$ because otherwise
> nginx/php-fpm will look for the script /b/index.php in
> /var/www/b/public/b/index.php, which has an extra "b/" in the path.

That kind-of answers one of the "which file?" questions, but leaves the
other one open.

> With the rewrite enabled, however, the PHP application guesses its own path
> incorrectly issuing redirects to locations that leave out "/b'.

Do you know which variable the application uses to guess its own path?

It could be REQUEST_URI or DOCUMENT_URI or maybe something else. (If it
is REQUEST_URI, then the change above may work for you.)

> I would like to avoid symlinking /var/www/b into /usr/share/a.
> Any ideas?

It should be possible; but I'm unclear on what you're trying to do,
so I can't suggest how to do it.

Maybe the REQUEST_URI change above is useful?

Depending on what else is in your config file, maybe replacing the two
/b/-related location blocks with the single nested

  location ^~ /b/ {
    alias  /var/www/b/public/;
    index  index.php;
    location ~ \.php$ {
      include /etc/nginx/fastcgi_params;
      fastcgi_pass unix:/var/run/php5-fpm.sock;

would do what you want?

(I've tested this with 1.2.6, not the 1.2.1 that you are using.)

Francis Daly        francis at

More information about the nginx mailing list