How to remove the "IF" in this fcgi config

Hi, I’m trying to setup a php app using fpm (owncloud).

I am trying to match urls which can all over the filesystem and of the
form: something.php/some/path?params

So far I have something like this:

             location / {
                     try_files $uri $uri/ index.php;
             }

             location ~ ^(?P<script_name>.+\.php)(/|$) {
                     fastcgi_split_path_info ^(.+\.php)(/.*)$;
                     if (!-f $script_name) {
                             #return 404;
                             break;
                     }
                     include fastcgi2.conf;
                     fastcgi_pass 127.0.0.1:9000;
             }

where:
fastcgi2.conf is a copy of fastcgi.conf with one change:
fastcgi_param REQUEST_URI $uri$is_args$args;

How do I avoid using an IF here to check that the php file really
exists? Also, why does uncommenting the return 404 cause some kind of
breakage (not even sure I understand exactly what happens? Seems like
the paths get broken?)

Thanks for any help?

Ed W

On Feb 21, 2013, at 21:48 , Ed W wrote:

where:
fastcgi2.conf is a copy of fastcgi.conf with one change:
fastcgi_param REQUEST_URI $uri$is_args$args;

How do I avoid using an IF here to check that the php file really exists? Also,
why does uncommenting the return 404 cause some kind of breakage (not even sure I
understand exactly what happens? Seems like the paths get broken?)

           location ~ ^(?<script_name>.+\.php)(?<path_info>/|$) {
                   try_files  $script_name  =404;

                   include fastcgi2.conf;
                   fastcgi_param  PATH_INFO  $path_info;
                   fastcgi_pass   127.0.0.1:9000;
           }


Igor S.

On 21/02/2013 17:54, Igor S. wrote:

            location ~ ^(?<script_name>.+\.php)(?<path_info>/|$) {
                    try_files  $script_name  =404;

                    include fastcgi2.conf;
                    fastcgi_param  PATH_INFO  $path_info;
                    fastcgi_pass   127.0.0.1:9000;
            }

Thanks!!
Can I ask you to confirm the correction of a typo in your answer. Do I
want this:

 ....(?<path_info>.*) {

ie is this ammended version correct in the face of a URL such as:

 blah.php/some/path?param=2

Thanks

Ed W

On Saturday 23 February 2013 00:11:26 Francis D. wrote:

You probably want

           location ~ ^(?<script_name>.+\.php)(?<path_info>/.*|$) {

because you want to match /X.php or /X.php/X but not /X.phpX.

IMHO,

location ~ ^(?<script_name>.+.php)(?<path_info>/.*)?$ {

looks better.

% pcretest -b -d -m -s+
PCRE version 8.30 2012-02-04

re> !^(?<script_name>.+.php)(?<path_info>/.*|$)!
Memory allocation (code space): 42
Memory allocation (JIT code): 1739

0 38 Bra
3 ^
4 15 CBra 1
9 Any+
11 .php
19 15 Ket
22 9 CBra 2
27 /
29 Any*
31 4 Alt
34 $
35 13 Ket
38 38 Ket
41 End

Capturing subpattern count = 2
Named capturing subpatterns:
path_info 2
script_name 1
Options: anchored
No first char
Need char = ‘p’
Subject length lower bound = 5
No set of starting bytes
data>

re> !^(?<script_name>.+.php)(?<path_info>/.*)?$!
Memory allocation (code space): 40
Memory allocation (JIT code): 1732

0 36 Bra
3 ^
4 15 CBra 1
9 Any+
11 .php
19 15 Ket
22 Brazero
23 9 CBra 2
28 /
30 Any*
32 9 Ket
35 $
36 36 Ket
39 End

Capturing subpattern count = 2
Named capturing subpatterns:
path_info 2
script_name 1
Options: anchored
No first char
Need char = ‘p’
Subject length lower bound = 5
No set of starting bytes

wbr, Valentin V. Bartenev

http://nginx.org/en/donation.html

On Thu, Feb 21, 2013 at 07:08:56PM +0000, Ed W wrote:

On 21/02/2013 17:54, Igor S. wrote:

Hi there,

           location ~ ^(?<script_name>.+\.php)(?<path_info>/|$) {

Can I ask you to confirm the correction of a typo in your answer. Do I
want this:

....(?<path_info>.*) {

You probably want

           location ~ ^(?<script_name>.+\.php)(?<path_info>/.*|$) {

because you want to match /X.php or /X.php/X but not /X.phpX.

f

Francis D. [email protected]

On Sat, Feb 23, 2013 at 02:05:56AM +0400, Valentin V. Bartenev wrote:

On Saturday 23 February 2013 00:11:26 Francis D. wrote:

           location ~ ^(?<script_name>.+\.php)(?<path_info>/.*|$) {

location ~ ^(?<script_name>.+.php)(?<path_info>/.*)?$ {

looks better.

Agreed.

And it means I don’t have to think about whether AB|C groups as (AB)|©
or (A)(B|C) in this regex implementation :slight_smile:

% pcretest -b -d -m -s+

Using smaller Memory allocation numbers is an extra bonus.

Cheers,

f

Francis D. [email protected]

On 2013-02-22 23:05, Valentin V. Bartenev wrote:

IMHO,

location ~ ^(?<script_name>.+.php)(?<path_info>/.*)?$ {

looks better.

In order to put yet another iteration into the game, I prefer the
script_name part to be non-greedy

 location ~ ^(?<script_name>.+?\.php)(?<path_info>/.*)?$ {

Of course it still depends on someone’s preference what to match in
case of

 /foo.php/bar.php/quux

-cs

On 24/02/2013 19:40, Christoph Schug wrote:

location ~ ^(?<script_name>.+?\.php)(?<path_info>/.*)?$ {

Of course it still depends on someone’s preference what to match in
case of

/foo.php/bar.php/quux

-cs

You beat me - I was just about to post the same!

I think the non greedy is probably the more common case

Thanks!

Ed W