nginx & php-fpm и чистые URL
Здравствуйте, я хотел бы настроить Nginx, как я хочу. Я прочитал много руководств (включая официальные), но не могу заставить его работать так, как я ожидаю.
У меня есть следующие URL: / user / register, / user / login, / user / logout и т. Д.... никаких URL-адресов с php-файлами.
Поэтому я хотел бы передать все нереальные URL-адреса файлов на сервер fast-cgi. Кстати, fpm работает в chroot.
Это мой конфигурационный файл:
server {
listen 80; ## listen for ipv4
server_name domain;
root /var/www/domain/htdocs;
include /etc/nginx/security;
fastcgi_read_timeout 6000;
location / {
try_files $uri $uri/ @php-fpm;
}
location @php-fpm {
fastcgi_pass unix:/tmp/php5-fpm.sock;
include /etc/nginx/fastcgi_params;
fastcgi_param DOCUMENT_ROOT /htdocs;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
}
}
в логе nginx я вижу:
- - [31/May/2012:16:02:12 +0300] "GET /user/register HTTP/1.1" 403 46 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46 Safari/536.5"
в фпм логи следующие:
- - 31/May/2012:13:02:12 +0000GET /user/register403 /var/www/domain/htdocs/user/register 0.215 512 0.00%
У меня Ubuntu 12.04 и nginx 1.1.19
PS На экране (в браузере) я вижу только этот текст "Входной файл не указан".
2 ответа
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
Итак, вы видите в логах именно то, что вы настроили. Возможно, вы хотите что-то вроде:
fastcgi_param SCRIPT_FILENAME /path/to/your/script.php;
Вы неправильно настроили try_files
, Как вы можете видеть в своем журнале php-fpm, точный URL-адрес передается на сервер PHP, который затем пытается получить файл с таким именем, которого, конечно, не существует.
Вам нужно либо переписать, либо просто изменить переданный файл, а затем обработать заданный URL в этом скрипте.
Адаптировано из моей собственной конфигурации nginx:
try_files $uri $uri/ index.php;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/tmp/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Эта конфигурация будет пересылать все файлы.php в php_fpm. Если вы предпочитаете, чтобы файлы.php вообще не были доступны напрямую, вам нужно использовать внутренние, которые скрыли бы их от внешнего мира, хотя в большинстве случаев вам это не нужно.
При использовании этой конфигурации все запросы будут перенаправлены на index.php
, Чтобы извлечь данные о странице, которую пользователь хочет просмотреть, загляните в PHP $_SERVER['REQUEST_URI']
, Если вы будете взрывать эту строку /
Имейте в виду, что первая запись массива будет пустой.