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

После переписывания nginx не использует php-fastcgi

У меня проблемы с перезаписью nginx. Я хочу переписать ^(.*?)/(.*?)/?$ к controllers/$1.php?action=$2. Раньше у меня это работало на сервере Apache. После этого я хочу перенаправить этот файл на php-fastcgi.

Для обычного запроса (т.е. когда я ввожу полный путь без перезаписи) php-fastcgi работает нормально.

Моя конфигурация:

server {
    listen [::]:80;

    root            /var/www/my-dir;
    index           index.php index.html index.htm;
    charset         utf-8;

    server_name         my-domain;

    location / {
        autoindex   off;
        rewrite     ^(.*?)/(.*?)/?$ controllers/$1.php?action=$2 last;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        include     fastcgi_params;
    }

    location ~ /\. {
        deny        all;
    }
}

После редактирования этой конфигурации я сделал service nginx restart, конечно.

По какой-то причине блок location для php-fastcgi не используется после перезаписи. Почему это так и как это решить?

Вместо этого я получаю ответ «Не указан входной файл». В журнале ошибок я вижу:

2013/06/01 19:00:25 [error] 14288#0: *1 access forbidden by rule, client: xxx, server: my-domain, request: "GET /user/create HTTP/1.1", host: "my-domain"

Вам не хватает try_files.

location / {
    try_files $uri $uri/ /index.php;
    # ....everything else
}

У вас также может быть проблема с rewrite поскольку у вас нет / в начале относительного URL controllers/$1.php.... Попробуйте изменить это на /controllers/$1.php....

И вам не хватает параметра fastcgi, который сообщает php-fpm, где найти скрипт PHP. Добавьте это в location ~ \.php$ блок.

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;