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'], Если вы будете взрывать эту строку /Имейте в виду, что первая запись массива будет пустой.

Другие вопросы по тегам