Executando o Moodle com o nginx no userdir (argumentos slash)

3

Estou movendo o Moodle (moodle.org) de um host do Apache para um host do Ubuntu 12.04 LTS executando o Nginx. A forma como o host é configurado significa que ele executará alguns domínios em que todo domínio (ou outro site) residirá em um diretório de usuário.

Estou executando o Nginx com o php5-fpm. Eu encontrei algumas configurações para executar o php-fpm dentro de um diretório do usuário, o que funciona. O problema, no entanto, é que o Moodle faz uso extensivo de argumentos slash no PHP, fazendo com que muitos URLs tenham esta aparência:

/home/[user]/public_html/theme/image.php/standard/theme/1377637305/favicon

Estou executando essa configuração do Nginx:

server {
        #listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default ipv6only=on; ## listen for ipv6

        root /usr/share/nginx/www;
        index index.html index.htm index.php;

        # Make site accessible from http://localhost/
        server_name localhost;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to index.html
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }

        location /doc/ {
                alias /usr/share/doc/;
                autoindex on;
                allow 127.0.0.1;
                deny all;
        }


        location ~ ^/~(?<userdir_user>.+?)(?<userdir_uri>/.*)?$ {
                alias /home/$userdir_user/public_html$userdir_uri;
                index index.html index.htm index.php;
                autoindex off; ## to allow autoindex a la apache

                include php5_generic;
        }
}

## php5_generic
        location ~ \.php {
                fastcgi_split_path_info ^(.+\.php)(/.*)$;

                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
                # With php5-cgi alone:
                fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
        #       fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }

O problema que tenho é que esta configuração funciona para arquivos PHP simples, mas não para solicitações HTTP GET usando argumentos barra. O log de erros do Nginx relata que o php-fpm gera erros como:

*615 open() "/home/[user]/public_html/theme/image.php/standard/core/1377637305/moodlelogo" failed (20: Not a directory),

ou

5 FastCGI sent in stderr: "Access to the script '/home/[user]/public_html/lib/javascript.php/1377637305/lib/javascript-static.js' has been denied (see security.limit_extensions)" 

O que está errado aqui?

    
por mauritslamers 28.08.2013 / 13:02

1 resposta

3

Eu encontrei uma solução, depois de usar a configuração de exemplo no link como base. Esta solução também sugere (como oposto a muitos outros exemplos) manter a configuração cgi.fix_pathinfo em php.ini para 1.

Em vez de optar por uma solução user_dir completa, optei por uma solução codificada, porque não sei (ainda) como fazer com que a variável $ userdir_user funcione dentro de um regex subseqüente.

A segunda coisa a procurar é a correção para o fastcgi_split_path_info. A razão é que, de outra forma, a parte ~ user é traduzida no caminho dado ao PHP.

server {
    index index.php index.html index.htm;

    location ~ ^/~user(?<userdir_uri>/.*)?$ {
            alias /home/user/public_html$userdir_uri;
            #autoindex on;

            #If this doesn't work, set cgi.fix_pathinfo=1 in /etc/php5/fpm/php.ini
            location ~ [^/]\.php(/|$) {
                    fastcgi_split_path_info ^/~user/(.+?\.php)(/.*)$;
                    include fastcgi_params;
                    fastcgi_pass 127.0.0.1:9000;
                    fastcgi_index index.php;
            }

    }

} 
    
por 01.09.2013 / 21:12