У меня проблемы с перезаписью 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;