Запуск Moodle с помощью nginx в userdir (аргументы с косой чертой)

Я перемещаю Moodle (moodle.org) с хоста Apache на хост Ubuntu 12.04 LTS, на котором работает Nginx. Способ установки хоста означает, что на нем будет работать немало доменов, где каждый домен (или другой сайт) будет находиться в каталоге пользователя.

Я использую Nginx с php5-fpm. Я нашел довольно много конфигураций для запуска php-fpm внутри пользовательского каталога, и все они работают. Проблема, однако, в том, что Moodle широко использует аргументы слэша в PHP, в результате чего многие URL выглядят так:

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

Я использую эту конфигурацию 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;
        }

У меня проблема в том, что эта конфигурация работает для простых файлов php, но не для запросов HTTP GET, использующих аргументы с косой чертой. Журнал ошибок Nginx сообщает, что php-fpm вызывает такие ошибки:

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

или же

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

Что здесь не так?

1 ответ

Я нашел решение, после использования примера конфигурации на http://wiki.nginx.org/PHPFcgiExample качестве основы. Это решение также предлагает (в отличие от многих других примеров) оставить параметр cgi.fix_pathinfo в php.ini равным 1.

Вместо того, чтобы искать полное решение user_dir, я выбрал жестко закодированное решение, потому что я не знаю (пока), как заставить переменную $userdir_user работать внутри последующего регулярного выражения.

Второе, на что нужно обратить внимание - это исправление fastcgi_split_path_info. Причина в том, что в противном случае пользовательская часть преобразуется в путь, указанный в 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;
            }

    }

} 
Другие вопросы по тегам