Nginx & UserDir & PHP

У меня довольно простая установка nginx/1.4.7 (из Debian/unstable), и я пытаюсь заставить PHP-скрипты работать внутри UserDir.

сервер {
        слушать 8083;                                
        имя_сервера sid0.local;
        index           index.php index.html;
        root            /data/www/sid0.local;

        место нахождения / {
                try_files $ uri $ uri / = 404;
        }

        # PHP-FPM
        location ~ \.php $ {
                включить fastcgi_params;
                fastcgi_pass unix: /var/run/php5-fpm.sock;
                fastcgi_index index.php;
        }

        # UserDir
        местоположение ~ ^/~(.+?)(/.*)?$ {
                псевдоним /home/$1/www$2;
                автоиндекс включен;
        }
}

Доступ к http://sid0.local/~dummy работает, он перечисляет содержание /home/dummy/www/ и я могу получить доступ к файлам там. Под ~dummy/bar это файл с именем index.php - пока нет доступа http://sid0.local/~dummy/bar/ приносит страшный "Файл не найден". ошибка (не 404). error.log имеет:

2014/04/30 23:07:44 [ошибка] 4237#0: *9 FastCGI отправил в stderr: "Основной сценарий неизвестен" при чтении заголовка ответа из апстрима, клиент: 192.168.0.103, сервер: sid0.local, запрос: "GET /~dummy/bar/ HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", хост: "sid0.local:8083"

Теперь, кажется, у многих людей есть эта проблема, и некоторые из них даже публикуют решения, например, убедиться, что SCRIPT_FILENAME установлен в request_filename - но это уже так (это установлено в fastcgi_params).

Тем не менее, работает strace(1) по отношению к процессу nginx дает (отредактировано для удобства чтения):

4045 connect (16, {sa_family = AF_FILE, path = "/ var / run / php5-fpm.sock"}, 110) = 0
4045 writev (16, [{"\ 1 \ 1 \ 0 \ 1 \ 0 \ 10 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 1 \ 4 \ 0 \ 1 \ 3T \ 4 \ 0 \ е \0
      QUERY_STRING\16\3
      REQUEST_METHODGET\ е \0
      CONTENT_TYPE\16\0
      CONTENT_LENGTH\0170
      SCRIPT_FILENAME/ данные / WWW /sid0.local/~ фиктивная / бар /index.php\v\25
      SCRIPT_NAME/~ фиктивная / бар / index.php \ v \ е
      REQUEST_URI/~ фиктивный / бар / \ х \25
      DOCUMENT_URI/~ фиктивная / бар / index.php \ г \33
      DOCUMENT_ROOT/ данные / WWW / sid0.local

Как вы видете, SCRIPT_FILENAME не является request_filename но вместо этого document_root+fastcgi_script_name - следовательно, 404, конечно.

Итак, я думаю, мой вопрос: почему мой SCRIPT_FILENAME покалеченный (я даже установил его fastcgi_script_name не повезло) и как я могу получить сценарии PHP внутри UserDir Бег?

2 ответа

Решение

Я бы изменил корневой каталог вместо использования псевдонима в местоположении. Это может выглядеть так:

listen          8083;                                
server_name     sid0.local;
index           index.php index.html;

# Here is magic
set $root_dir /data/www/sid0.local;
rewrite ^(/~[^/]+)$ $1/ redirect;
rewrite ^/~(?<user>[^/]+)(.+) $2;
if ($user) {
    set $root_dir /home/$user/www;
}
root $root_dir;

# PHP-FPM
location ~ \.php$ {
    try_files $uri =404;
    include         fastcgi_params;
    fastcgi_pass    unix:/var/run/php5-fpm.sock;
    fastcgi_index   index.php;
}

Еще одна версия без переписывания:

listen          8083;                                
server_name     sid0.local;
index           index.php index.html;

root /data/www/sid0.local;

location ~ ^/~(?<user>[\w-]+)(?<path>/.*)$ {
    alias /home/lynn/tmp/site/$user/www$path;
    autoindex on;

    # PHP-FPM
    location ~ \.php$ {
        try_files $uri =404;
        include         fastcgi_params;
        fastcgi_pass    unix:/var/run/php5-fpm.sock;
        fastcgi_index   index.php;
    }
}

По какой-то причине alias с именованными захватами работает, в то время как с числовыми ссылками это не удается. Я предполагаю, что числовые ссылки как-то очищаются во вложенном месте.

Основываясь на ответе Алекси Тен, я поместил следующие файлы конфигурации в /etc/nginx/default.d/ как они включены nginx.conf в моей установке по умолчанию:

$ cat 00-index.conf 
index index.html;

$ cat 50-userdirs.conf
location ~ ^/~(?<user>[\w-]+)(?<path>/?.*)$ {
    alias /home/$user/www$path;
    autoindex on;
}

Обратите внимание на добавленное ? символ после / символ для соответствия hostname/~user без косой черты. Это исправляет одну ошибку 404.

Если вы получаете 403 ошибки из-за SELinux, вам необходимо обновить правила доступа:

# semanage fcontext -a -t httpd_user_content_t '/home/[^/]*/www/.*'
# for userdir in /home/* ; do restorecon -Rvi "$userdir/www" ; done
Другие вопросы по тегам