Назад | Перейти на главную страницу

Конфигурация nginx с нарушением php и псевдонимом после обновления

Я настроил доступ к локальному каталогу через поддержку nginx alias + php: https://mydomain.de/wbg указывает на /var/www/wallabag. Все работало нормально, пока я не выполнил обычное обновление apt-get update && apt-get upgrade на сервере (работающем на debian 8). Теперь, когда я открываю сайт, я получаю только «Входной файл не указан». Вот что говорит nginx:

2016/02/20 13:07:14 [error] 4376#0: *1 FastCGI sent in stderr: "Unable to open primary script: /var/www/wallabag/index.php/wbg/index.php (No such file or directory)" while reading response header from upstream, client: 78.50.228.24, server: mydomain.de, request: "GET /wbg/ HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "mydomain.de"

Это важная часть моей конфигурации:

server {
    server_name mydomain.de;

    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    # ssl configuration
    # ...

    root /var/www/html;

    index index.php index.html index.htm index.nginx-debian.html;

    location / {
        # ...
    }

    location /wbg/ {
        alias /var/www/wallabag/;

        index index.php;

        location ~ ^.+?\.php(/.*)?$ {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_split_path_info ^(.+\.php)(/.*)$;
                set $path_info $fastcgi_path_info;
                fastcgi_param PATH_INFO $path_info;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $request_filename$fastcgi_script_name;
        }
    }
}

Как это возможно, что эта конфигурация сломается после обновления? И как это исправить?

(версия nginx - 1.6.2-5 + deb8u1 после обновления, php5-fpm: 5.6.17 + dfsg-0 + deb8u1)

Простой ответ заключается в том, что сообщение об ошибке соответствует вашей конфигурации в том виде, в котором она есть сейчас, поэтому я понятия не имею, как это работало до обновления.

В fastcgi_param SCRIPT_FILENAME $request_filename$fastcgi_script_name линия генерирует значение /var/www/wallabag/index.php/wbg/index.php так как:

$request_filename    = /var/www/wallabag/index.php
$fastcgi_script_name = /wbg/index.php

Если вы не используете информацию о пути (это URI, следующий за .php) вы можете упростить PHP-часть конфигурации и просто использовать $request_filename. Что-то вроде:

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $request_filename;
}

Однако для создания SCRIPT_FILENAME из URI с информацией о пути вы можете использовать:

location ~ \.php(/|$) {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_split_path_info ^/wbg(.+\.php)(/.*)?$;
    include fastcgi_params;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

Заметь fastcgi_split_path_info удаляет /wbg префикс из URI, чтобы построить правильное значение для SCRIPT_FILENAME.