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

**URL:** <https://www.ruby-forum.com/t/php-via-fastcgi-in-and-sub-directory-location-w-different-roots/237347>\
**Category:** NGINX\
**Created:** [November 7, 2013, 11:38am UTC](https://www.ruby-forum.com/t/php-via-fastcgi-in-and-sub-directory-location-w-different-roots/237347 "2013-11-07T11:38:08Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![musicdenotation](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/ea666f/32.png) [@musicdenotation](https://www.ruby-forum.com/u/musicdenotation)\
**Post date:** [November 7, 2013, 11:38am UTC](https://www.ruby-forum.com/t/php-via-fastcgi-in-and-sub-directory-location-w-different-roots/237347/1 "2013-11-07T11:38:08Z")

</div>

Hi there,

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

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.

My current ngnix (1.2.1) configuration looks like this:

– 8\< –  
server {  
listen \*:443 ssl;  
listen [::]:443 ;

[…]

root /usr/share/a;  
index index.php;

location ~ ^/b/._.php$ {  
rewrite ^/b(/._) $1 break;  
root /var/www/b/public;  
include /etc/nginx/fastcgi\_params;  
fastcgi\_pass unix:/var/run/php5-fpm.sock;  
}

location ~ .php$ {  
include /etc/nginx/fastcgi\_params;  
fastcgi\_pass unix:/var/run/php5-fpm.sock;  
}

location ~ ^/b/ {  
root /var/www/b/public;  
index index.php;  
}  
}  
– 8\< –

/etc/nginx/fastcgi\_params:  
– 8\< –  
fastcgi\_param QUERY\_STRING $query\_string;  
fastcgi\_param REQUEST\_METHOD $request\_method;  
fastcgi\_param CONTENT\_TYPE $content\_type;  
fastcgi\_param CONTENT\_LENGTH $content\_length;

fastcgi\_param SCRIPT\_FILENAME $request\_filename;  
fastcgi\_param SCRIPT\_NAME $fastcgi\_script\_name;  
fastcgi\_param REQUEST\_URI $uri?$args;  
fastcgi\_param DOCUMENT\_URI $document\_uri;  
fastcgi\_param DOCUMENT\_ROOT $document\_root;  
fastcgi\_param SERVER\_PROTOCOL $server\_protocol;

fastcgi\_param GATEWAY\_INTERFACE CGI/1.1;  
fastcgi\_param SERVER\_SOFTWARE nginx/$nginx\_version;

fastcgi\_param REMOTE\_ADDR $remote\_addr;  
fastcgi\_param REMOTE\_PORT $remote\_port;  
fastcgi\_param SERVER\_ADDR $server\_addr;  
fastcgi\_param SERVER\_PORT $server\_port;  
fastcgi\_param SERVER\_NAME $server\_name;

fastcgi\_param HTTPS $https;

# PHP only, required if PHP was built with --enable-force-cgi-redirect

fastcgi\_param REDIRECT\_STATUS 200;  
– 8\< –

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.

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

I would like to avoid symlinking /var/www/b into /usr/share/a.

Any ideas?

Thanks,  
Thilo

---

<div class="post-metadata">

**Author:** ![Thilo-Alexander\_Gin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/3e96dc/32.png) [@Thilo-Alexander\_Gin](https://www.ruby-forum.com/u/Thilo-Alexander_Gin)\
**Post date:** [November 7, 2013, 1:44pm UTC](https://www.ruby-forum.com/t/php-via-fastcgi-in-and-sub-directory-location-w-different-roots/237347/2 "2013-11-07T13:44:20Z")

</div>

IMHO, using a rewrite in nginx to modify the way PHP processes the  
request  
looks strange to me. Maybe am I wrong.

Have you had a look in the content of the params you send to PHP through  
CGI? Overloading some of the variables by removing the leading ‘/b’  
there  
might help PHP resolving correctly the filename while searching it on  
disk.  
I would personally look in that direction.

## I would also use another PHP pool (thus another socket) to isolate both applications.

_B. R._

---

<div class="post-metadata">

**Author:** ![Thilo-Alexander\_Gin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/3e96dc/32.png) [@Thilo-Alexander\_Gin](https://www.ruby-forum.com/u/Thilo-Alexander_Gin)\
**Post date:** [November 8, 2013, 11:24pm UTC](https://www.ruby-forum.com/t/php-via-fastcgi-in-and-sub-directory-location-w-different-roots/237347/3 "2013-11-08T23:24:37Z")

</div>

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.

OK.

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

OK.

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.)

## f

Francis D. removed\_email\_address@domain.invalid
