try_files acting weird, maybe affected by IF ?

HosipLan nginx-forum at nginx.us
Sat Jun 16 16:08:35 UTC 2012


Hi,
I've been trying to force nginx to dynamically handle hosts. This is my
configuration file

        server {
                listen          127.0.0.1:80;
                server_name    
~^(:?(?<second>.+)\.)?(?<domain>[^.]+\.[^.]+)$;
                index           index.php index.html;

                location / {
                        set             $try_dir $domain;
                        if (-d /var/www/hosts/$second.$domain) { 
                                set     $try_dir $second.$domain;
                        }

                        root            /var/www/hosts/$try_dir;
                        try_files       $uri $uri/ /index.php;
                }

                # pass the PHP scripts to FastCGI server listening on
127.0.0.1:9000
                location ~ \.php$ {
                        set             $try_dir $domain;
                        if (-d /var/www/hosts/$second.$domain) {
                                set     $try_dir $second.$domain;
                        }

                        root            /var/www/hosts/$try_dir;
                        include         fastcgi_params;
                        fastcgi_param   SERVER_NAME     $try_dir;
                        fastcgi_pass    127.0.0.1:9000;
                        fastcgi_index   index.php;

                        fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
                        fastcgi_param   PATH_INFO $fastcgi_path_info;
                        fastcgi_param   PATH_TRANSLATED
$document_root$fastcgi_path_info;

                        fastcgi_param   SCRIPT_FILENAME
$document_root$fastcgi_script_name;

                        try_files $uri =404;
                }
        }


It receives request, checks if exists corresponding subdirectory, if
not, passes to "main" directory.
I know I shouldn't be using the IF statement, but I've tried many, but
havent figured this out without the if.

So let's have a request  

        $ curl http://hosiplan.l/rewrite

The directory /var/www/hosts/hosiplan.l exists, there is index.php file
and no "rewrite" file. This should be handled by the index.php

        ...
        [debug]: *1 using configuration "/"
        ...
        [debug]: *1 http script file op 0000000000000002
"/var/www/hosts/.hosiplan.l"
        [debug]: *1 http script file op false
        [debug]: *1 http script if
        [debug]: *1 http script if: false
        ...
        [debug]: *1 try files phase: 11
        ...
        [debug]: *1 try to use file: "/rewrite"
"/var/www/hosts/hohosiplan.l/rewrite"
        ...
        [debug]: *1 try to use dir: "/rewrite"
"/var/www/hosts/hohosiplan.l/rewrite"
        ...
        [debug]: *1 try to use file: "/index.php"
"/var/www/hosts/hohosiplan.l/index.php"
        [debug]: *1 internal redirect: "/index.php?"
        ...

This works like a charm. Pure perfection. But when I use a subdomain 

        $ curl http://blaphp.hosiplan.l/rewrite

The directory /var/www/hosts/blaphp.hosiplan.l exists, there is
index.php file and no "rewrite" file. This should be handled by the
index.php

        ... 
        [debug]: *3 using configuration "/"
        ... 
        [debug]: *3 http script file op 0000000000000002
"/var/www/hosts/blaphp.hosiplan.l"
        [debug]: *3 http script if
        ...
        [debug]: *3 try files phase: 11
        ...
        [debug]: *3 http filename:
"/var/www/hosts/blaphp.hosiplan.l/rewrite"
        2012/06/16 17:05:45 [error] 2604#0: *3 open()
"/var/www/hosts/blaphp.hosiplan.l/rewrite" failed (2: No such file or
directory), client: 127.0.0.1, server:
~^(:?(?<second>.+)\.)?(?<domain>[^.]+\.[^.]+)$, request: "GET /rewrite
HTTP/1.1", host: "blaphp.hosiplan.l"

And that's where I'm stuck. Any kind of input would be really
appreciated.

Posted at Nginx Forum: http://forum.nginx.org/read.php?2,227602,227602#msg-227602



More information about the nginx mailing list