nginx+php_fpm никак не могу реализовать стандартный rewrite на nginx - всегда даёт "404 Not Found" задача такая: "если папки не существует - кидать на index.php" Это .htaccess версия редиректа Код (Text): DirectoryIndex index.php RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^(.+)$ - [L] RewriteCond $1 !(\.css)|(\.js)|(\.ico)|(\.swf)|(\.jpg)|(\.png)|(\.gif)$ [NC] RewriteRule ^(.*)$ index.php [QSA,NC,L] Пробовал через try_files Код (Text): try_files $uri $uri/ /index.php; и таким способом (который обычно работал) Код (Text): location / { index index.php; if (!-e $request_filename) { rewrite ^/(.*)$ /index.php last; } } уже голову сломал в логах nginx - на запрос просто 404я идёт Добавлено спустя 5 минут 58 секунд: Добавил fastcgi_param REQUEST_URI $uri; Заработало - НО скрипт считает что я не папку открываю, а корень сайта Код (Text): location ~ \.php$ { include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param REQUEST_URI $uri; fastcgi_pass unix:/tmp/php-fpm.sock; }
Код (PHP): location / { # try to serve file directly, fallback to app.php try_files $uri /index.php$is_args$args; } location ~ ^/(index)\.php(/|$) { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$; ... }
Код (Text): location / { index index.php; try_files $uri /index.php$is_args$args; } location ~ ^/(index)\.php(/|$) { fastcgi_pass unix:/tmp/php-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param REQUEST_URI $uri; } Добавлено спустя 43 секунды: не пашет - обрабатывает папку, как корень Добавлено спустя 2 минуты 49 секунд: если убрать Код (Text): fastcgi_param REQUEST_URI $uri; даёт 404ю
это аппач Код (Text): RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^(.+)$ - [L] RewriteCond $1 !(\.css)|(\.js)|(\.ico)|(\.swf)|(\.jpg)|(\.png)|(\.gif)$ [NC] RewriteRule ^(.*)$ index.php [QSA,NC,L] site.ru/dir/ - сайт отдаёт контент для /dir/ переделал на nginx + php_fpm с вышеуказанными настройками site.ru/dir/ - сайт отдаёт контент для /index.php
дёргаю site.ru/dir/ в $_SERVER ни одного упоминания о этой папке везде просто index.php - как будто я его "спросил"
то есть задача: если НЕ файл и НЕ каталог - выполнить корневой индекс пхп? я просто стесняюсь тех правил htaccess которые в первом посте опубликованы
ууу у меня вообще жесть какая то - создал физически папку /exdir/ положил туда index.php дёргаю его /exdir/index.php он мне вообще сохранить в виде файла его предлагает дёргаю /exdir/ - морда отображается в общем система вообще с папками неверно работает Добавлено спустя 1 минуту 9 секунд: Код (Text): fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param HTTPS $https if_not_empty; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200;
Всё верно, ты прописал вызываемый файл: fastcgi_param REQUEST_URI $uri; а ты видимо хотел: fastcgi_param REQUEST_URI $request_uri;
У меня всё работает Код (PHP): server { server_name dev.example.org; root /www/dev.example.com/; location / { # try to serve file directly, fallback to app.php try_files $uri /app.php$is_args$args; } location ~ ^/app\.php(/|$) { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }
вот вам и использование денверовкуенверов и оупенсерверов. чего сложного конфиг сервера написать? Код (Text): server { root /var/www; - указали рут index index.php index.html; - указали какие файлы нгинксу сервить в качестве индекса каталога. любого каталога. location / { - для любой локации начинающейся со слеша. то есть для любой локации try_files $uri $uri/ /index.php; - пробуем обработать как файл, потом как каталог. если но то ни сё - сваливаемся к индекс.пхп в корне напомню что если ресурс - каталог и не указано разрешение сервить его листинг - будет попытка найти индексные файлы в порядке перечисления выше } location ~ \.php$ { - для любой локации завершающейся на дот-пхп fastcgi_pass unix:/tmp/php-fpm.sock; - отправляем к такому-то бэкэнду fastcgi_index index.php; - уведомляем пхп-машину что вот такие файлы мы автоматом аппендим к имени ресурса если он заканчивается слешем то есть является каталогом fastcgi_param $document_root$fastcgi_script_name; - выполняем вот такой скрипт include fastcgi_params; - все удобные правила установки переменных окружения лежат в таком-то файле в рабочем каталоге нгинкса } } к сожалению у меня руки прямые и это кусок рабочего конфига одного из хостов (для удобства тс я сразу подставил его путь к фпм сокету)
тут видимо пропущено SCRIPT_FILENAME так "REQUEST_URI" нормально передался а в остальном php не увидел директорию Код (Text): ["REQUEST_URI"]=> string(8) "/dir/" ["QUERY_STRING"]=> string(0) "" ["REQUEST_METHOD"]=> string(3) "GET" ["CONTENT_TYPE"]=> string(0) "" ["CONTENT_LENGTH"]=> string(0) "" ["SCRIPT_NAME"]=> string(10) "/index.php" ["DOCUMENT_URI"]=> string(10) "/index.php" ["DOCUMENT_ROOT"]=> Добавлено спустя 2 минуты 47 секунд: Такое впечатление что fastcgi_script_name не пашет
мне кажется то ли ты не въезжаешь в алгоритм либо ты не можешь задачу нормально объяснить / -> /index.php RURI=/ используется дополнение индекса после чего оригинальный файл /foo.php -> есть -> /foo.php RURI=/foo.php используется оригинальный файл /bar.php -> нет -> /index.php RURI=/bar.php используется редирект несуществующего файла /dir/ есть... варианты существующего каталога /dir/index.php есть -> /dir/index.php RURI=/dir/ используется дополнение индекса после чего оригинальный файл /dir/index.php нет -> /index.php RURI=/dir/ используется редирект несуществующего файла /rid/ нет... единственно возможный вариант несуществующего каталога /rid/ -> /index.php RURI=/rid/ используется редирект несуществующего файла
Ganzal, всё именно так Добавлено спустя 2 минуты 42 секунды: http://rekrea.ru/notexistdir/ обрабатывается /index.php несуществующая директория http://rekrea.ru/dir/ это существующая директория