За последние 24 часа нас посетили 8012 программистов и 515 роботов. Сейчас ищут 240 программистов ...

NGINX site.ru/dir на index.php

Тема в разделе "Прочее", создана пользователем GTAlex, 7 мар 2015.

  1. GTAlex

    GTAlex Новичок

    С нами с:
    7 мар 2015
    Сообщения:
    63
    Симпатии:
    2
    nginx+php_fpm
    никак не могу реализовать стандартный rewrite на nginx - всегда даёт "404 Not Found"
    задача такая: "если папки не существует - кидать на index.php"

    Это .htaccess версия редиректа
    Код (Text):
    1.  
    2. DirectoryIndex index.php
    3.  
    4. RewriteEngine On
    5. RewriteBase /
    6.  
    7. RewriteCond %{REQUEST_FILENAME} -f [OR]
    8. RewriteCond %{REQUEST_FILENAME} -d
    9. RewriteRule ^(.+)$ - [L]
    10. RewriteCond $1 !(\.css)|(\.js)|(\.ico)|(\.swf)|(\.jpg)|(\.png)|(\.gif)$ [NC]
    11. RewriteRule ^(.*)$ index.php [QSA,NC,L]
    Пробовал через try_files
    Код (Text):
    1.  
    2. try_files $uri  $uri/ /index.php;
    и таким способом (который обычно работал)
    Код (Text):
    1.  
    2. location /  {
    3.              index  index.php;
    4.              if (!-e $request_filename) {
    5.                rewrite ^/(.*)$ /index.php last;
    6.              }
    7.     }
    уже голову сломал :(
    в логах nginx - на запрос просто 404я идёт

    Добавлено спустя 5 минут 58 секунд:
    Добавил fastcgi_param REQUEST_URI $uri;
    Заработало - НО скрипт считает что я не папку открываю, а корень сайта :(

    Код (Text):
    1.     location ~ \.php$ {
    2.         include /etc/nginx/fastcgi_params;
    3.         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    4.         fastcgi_param REQUEST_URI $uri;
    5.         fastcgi_pass  unix:/tmp/php-fpm.sock;
    6.     }
     
  2. denis01

    denis01 Старожил
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.132
    Симпатии:
    1.677
    Адрес:
    Молдова, г.Кишинёв
    Код (PHP):
    1.     location / {
    2.         # try to serve file directly, fallback to app.php
    3.         try_files $uri /index.php$is_args$args;
    4.     }
    5.  
    6.     location ~ ^/(index)\.php(/|$) {
    7.         fastcgi_pass unix:/var/run/php5-fpm.sock;
    8.         fastcgi_split_path_info ^(.+\.php)(/.*)$;
    9. ...
    10.     }
    11.  
     
  3. GTAlex

    GTAlex Новичок

    С нами с:
    7 мар 2015
    Сообщения:
    63
    Симпатии:
    2
    Код (Text):
    1.  
    2.     location / {
    3.         index  index.php;
    4.             try_files $uri /index.php$is_args$args;
    5.         }
    6.  
    7.     location ~ ^/(index)\.php(/|$) {
    8.         fastcgi_pass  unix:/tmp/php-fpm.sock;
    9.         fastcgi_split_path_info ^(.+\.php)(/.*)$;
    10.    
    11.         include /etc/nginx/fastcgi_params;
    12.  
    13.         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    14.         fastcgi_param REQUEST_URI $uri;
    15.  
    16.     }
    Добавлено спустя 43 секунды:
    не пашет - обрабатывает папку, как корень

    Добавлено спустя 2 минуты 49 секунд:
    если убрать
    Код (Text):
    1.     fastcgi_param REQUEST_URI $uri;
    даёт 404ю
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.785
    Симпатии:
    936
    denis01, не ожидал от тебя такого)))) давай еще попробуй)))
     
  5. denis01

    denis01 Старожил
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.132
    Симпатии:
    1.677
    Адрес:
    Молдова, г.Кишинёв
    Может я не понял, что ему нужно? Взял пример из документации symfony2, всё перехватывает
     
  6. GTAlex

    GTAlex Новичок

    С нами с:
    7 мар 2015
    Сообщения:
    63
    Симпатии:
    2
    это аппач

    Код (Text):
    1.  
    2. RewriteCond %{REQUEST_FILENAME} -f [OR]
    3. RewriteCond %{REQUEST_FILENAME} -d
    4. RewriteRule ^(.+)$ - [L]
    5. RewriteCond $1 !(\.css)|(\.js)|(\.ico)|(\.swf)|(\.jpg)|(\.png)|(\.gif)$ [NC]
    6. RewriteRule ^(.*)$ index.php [QSA,NC,L]
    site.ru/dir/ - сайт отдаёт контент для /dir/

    переделал на nginx + php_fpm с вышеуказанными настройками
    site.ru/dir/ - сайт отдаёт контент для /index.php :(
     
  7. denis01

    denis01 Старожил
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.132
    Симпатии:
    1.677
    Адрес:
    Молдова, г.Кишинёв
    а что в папке dir и что ты хочешь получить?
     
  8. GTAlex

    GTAlex Новичок

    С нами с:
    7 мар 2015
    Сообщения:
    63
    Симпатии:
    2
    дёргаю site.ru/dir/
    в $_SERVER ни одного упоминания о этой папке
    везде просто index.php - как будто я его "спросил"
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.785
    Симпатии:
    936
    в каталогах индекс.пхп лежат? ))) или он один на весь сайт?
     
  10. GTAlex

    GTAlex Новичок

    С нами с:
    7 мар 2015
    Сообщения:
    63
    Симпатии:
    2
    этой папки не существует
    всё обрабатывает /index.php
     
  11. denis01

    denis01 Старожил
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.132
    Симпатии:
    1.677
    Адрес:
    Молдова, г.Кишинёв
    А нужно что?
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.785
    Симпатии:
    936
    то есть задача: если НЕ файл и НЕ каталог - выполнить корневой индекс пхп?
    я просто стесняюсь тех правил htaccess которые в первом посте опубликованы
     
  13. denis01

    denis01 Старожил
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.132
    Симпатии:
    1.677
    Адрес:
    Молдова, г.Кишинёв
    GTAlex ты подгрузил fastcgi_params и что там у тебя?
     
  14. GTAlex

    GTAlex Новичок

    С нами с:
    7 мар 2015
    Сообщения:
    63
    Симпатии:
    2
    ууу
    у меня вообще жесть какая то - создал физически папку /exdir/
    положил туда index.php
    дёргаю его /exdir/index.php
    он мне вообще сохранить в виде файла его предлагает :(
    дёргаю /exdir/ - морда отображается

    в общем система вообще с папками неверно работает :(

    Добавлено спустя 1 минуту 9 секунд:
    Код (Text):
    1.  
    2. fastcgi_param  QUERY_STRING       $query_string;
    3. fastcgi_param  REQUEST_METHOD     $request_method;
    4. fastcgi_param  CONTENT_TYPE       $content_type;
    5. fastcgi_param  CONTENT_LENGTH     $content_length;
    6.  
    7. fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
    8. fastcgi_param  REQUEST_URI        $request_uri;
    9. fastcgi_param  DOCUMENT_URI       $document_uri;
    10. fastcgi_param  DOCUMENT_ROOT      $document_root;
    11. fastcgi_param  SERVER_PROTOCOL    $server_protocol;
    12. fastcgi_param  HTTPS              $https if_not_empty;
    13.  
    14. fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
    15. fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
    16.  
    17. fastcgi_param  REMOTE_ADDR        $remote_addr;
    18. fastcgi_param  REMOTE_PORT        $remote_port;
    19. fastcgi_param  SERVER_ADDR        $server_addr;
    20. fastcgi_param  SERVER_PORT        $server_port;
    21. fastcgi_param  SERVER_NAME        $server_name;
    22.  
    23. # PHP only, required if PHP was built with --enable-force-cgi-redirect
    24. fastcgi_param  REDIRECT_STATUS    200;
     
  15. denis01

    denis01 Старожил
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.132
    Симпатии:
    1.677
    Адрес:
    Молдова, г.Кишинёв
    fastcgi_param REQUEST_URI $request_uri;

    в phpinfo() нет $_SERVER['REQUEST_URI'] ?
     
  16. GTAlex

    GTAlex Новичок

    С нами с:
    7 мар 2015
    Сообщения:
    63
    Симпатии:
    2
    Код (Text):
    1.   ["REQUEST_URI"]=>
    2.   string(10) "/index.php"
     
  17. denis01

    denis01 Старожил
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.132
    Симпатии:
    1.677
    Адрес:
    Молдова, г.Кишинёв
    Всё верно, ты прописал вызываемый файл: fastcgi_param REQUEST_URI $uri;
    а ты видимо хотел: fastcgi_param REQUEST_URI $request_uri;
     
  18. GTAlex

    GTAlex Новичок

    С нами с:
    7 мар 2015
    Сообщения:
    63
    Симпатии:
    2
    так получаю 404 Not Found
     
  19. denis01

    denis01 Старожил
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.132
    Симпатии:
    1.677
    Адрес:
    Молдова, г.Кишинёв
    У меня всё работает

    Код (PHP):
    1. server {
    2.     server_name dev.example.org;
    3.     root /www/dev.example.com/;
    4.  
    5.     location / {
    6.         # try to serve file directly, fallback to app.php
    7.         try_files $uri /app.php$is_args$args;
    8.     }
    9.  
    10.     location ~ ^/app\.php(/|$) {
    11.         fastcgi_pass unix:/var/run/php5-fpm.sock;
    12.         fastcgi_split_path_info ^(.+\.php)(/.*)$;
    13.         include fastcgi_params;
    14.         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    15.     }
    16. } 
     
  20. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.785
    Симпатии:
    936
    вот вам и использование денверовкуенверов и оупенсерверов. чего сложного конфиг сервера написать?
    Код (Text):
    1. server {    
    2.     root /var/www; - указали рут
    3.     index index.php index.html; - указали какие файлы нгинксу сервить в качестве индекса каталога. любого каталога.
    4.  
    5.     location / { - для любой локации начинающейся со слеша. то есть для любой локации
    6.         try_files $uri $uri/ /index.php; - пробуем обработать как файл, потом как каталог. если но то ни сё - сваливаемся к индекс.пхп в корне
    7.         напомню что если ресурс - каталог и не указано разрешение сервить его листинг - будет попытка найти индексные файлы в порядке перечисления выше
    8.     }
    9.  
    10.     location ~ \.php$ { - для любой локации завершающейся на дот-пхп
    11.         fastcgi_pass unix:/tmp/php-fpm.sock; - отправляем к такому-то бэкэнду
    12.         fastcgi_index index.php; - уведомляем пхп-машину что вот такие файлы мы автоматом аппендим к имени ресурса если он заканчивается слешем то есть является каталогом
    13.         fastcgi_param $document_root$fastcgi_script_name; - выполняем вот такой скрипт
    14.         include fastcgi_params; - все удобные правила установки переменных окружения лежат в таком-то файле в рабочем каталоге нгинкса
    15.     }
    16. }
    к сожалению у меня руки прямые и это кусок рабочего конфига одного из хостов (для удобства тс я сразу подставил его путь к фпм сокету)
     
  21. GTAlex

    GTAlex Новичок

    С нами с:
    7 мар 2015
    Сообщения:
    63
    Симпатии:
    2
    тут видимо пропущено SCRIPT_FILENAME

    так "REQUEST_URI" нормально передался
    а в остальном php не увидел директорию :(

    Код (Text):
    1. ["REQUEST_URI"]=>
    2.   string(8) "/dir/"
    3.   ["QUERY_STRING"]=>
    4.   string(0) ""
    5.   ["REQUEST_METHOD"]=>
    6.   string(3) "GET"
    7.   ["CONTENT_TYPE"]=>
    8.   string(0) ""
    9.   ["CONTENT_LENGTH"]=>
    10.   string(0) ""
    11.   ["SCRIPT_NAME"]=>
    12.   string(10) "/index.php"
    13.   ["DOCUMENT_URI"]=>
    14.   string(10) "/index.php"
    15.   ["DOCUMENT_ROOT"]=>
    Добавлено спустя 2 минуты 47 секунд:
    Такое впечатление что fastcgi_script_name не пашет
     
  22. denis01

    denis01 Старожил
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.132
    Симпатии:
    1.677
    Адрес:
    Молдова, г.Кишинёв
    GTAlex какая версия nginx у тебя?
     
  23. GTAlex

    GTAlex Новичок

    С нами с:
    7 мар 2015
    Сообщения:
    63
    Симпатии:
    2
  24. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.785
    Симпатии:
    936
    мне кажется то ли ты не въезжаешь в алгоритм либо ты не можешь задачу нормально объяснить

    / -> /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/ используется редирект несуществующего файла
     
  25. GTAlex

    GTAlex Новичок

    С нами с:
    7 мар 2015
    Сообщения:
    63
    Симпатии:
    2
    Ganzal, всё именно так

    Добавлено спустя 2 минуты 42 секунды:
    http://rekrea.ru/notexistdir/
    обрабатывается /index.php
    несуществующая директория

    http://rekrea.ru/dir/
    это существующая директория