Nginx Разное поведение rewrite

weregod

unserializer
Голову сломал, у меня Nginx под Windows, у заказчика под Centos, заказчик выдал правило для конфига:
Код:
location / {
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php?s=/$1 last;
        break;
    }
}
Код:
server {
    listen 127.0.0.1:80;
    server_name test.loc;

    index index.php index.html index.htm;
    
    root "тут путь";
    
    location / {
        if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php?s=/$1 last;
            break;
        }
    }

    location ~ \.php$ {
        try_files $uri =404;
        include nginx.fastcgi.conf;
        include nginx.redis.conf;
        fastcgi_pass php_farm;
        fastcgi_hide_header X-Powered-By;
    }
}

И скрипт (находящийся в index.php в корне сайта)
PHP:
<?php

echo "<pre>";

$keys = [
    "PATH_INFO",
    "DOCUMENT_URI",
    "QUERY_STRING",
    "PHP_SELF",
];

foreach ($keys as $key) {
    echo sprintf("<b>%s</b>: %s\n", $key, $_SERVER[$key]);
}
у меня при запросе http://test.loc/index.php/foo/bar?arg=value выводит
Код:
PATH_INFO:
DOCUMENT_URI: /index.php
QUERY_STRING: s=//index.php/foo/bar&arg=value
PHP_SELF:
А у заказчика:
Код:
PATH_INFO: /foo/bar
DOCUMENT_URI: /index.php/foo/bar
QUERY_STRING: arg=value
PHP_SELF: /index.php/foo/bar
В результате у мну локально роутер дурит и придумывает левый контроллер. Подсказать кто-то может, в чём дело? Или мне не весь location { ... } показали?
 

WMix

герр M:)ller
Партнер клуба
я тоже бы проще написал
Код:
try_files $uri /index.php?s=$request_uri
в твоем случае if (!-e $request_filename) возвращает истину, и срабатывает реврайт, а у "заказчика" false
 

weregod

unserializer
Код:
location / {
    try_files $uri $uri/ @foo;
}

location @foo {
    fastcgi_param SCRIPT_NAME     /index.php;
    fastcgi_param SCRIPT_FILENAME /path/to/index.php;
}
404-ую даёт ((( Путь ":" содержит, пытался и в двойные кавычки обрамлять, и в одинарные, и обратные одинарные/задвоенные слэша использовать -- всё одно.
 

fixxxer

К.О.
Партнер клуба
Я надеюсь, в /path/to/index.php у тебя реальный путь к index.php, а не прямо "/path/to"?

А вообще поставь WSL, и под ним заведи nginx и php с fpm sapi. nginx for windows - это мазохизм. Тем более что в PHP FPM SAPI под Windows вообще нет, а CGI-FCGI SAPI - это код, который никто не трогал года этак с 2001-го, и там вообще хрен знает как всё работает :) Нафига тебе эти танцы с бубном, если Microsoft давно уже дал нативное решение для запуска Linux-софта?
 
Последнее редактирование:

weregod

unserializer
Я надеюсь, в /path/to/index.php у тебя реальный путь к index.php, а не прямо "/path/to"?
Очевидно, что реальный путь )
Ломы память довтыкивать, третью неделю на столе лежит. Заводил я его до вынужденной перестановки винды (системный винт помер), не помню, не мешает ли он альтернативным виртуалкам типа эмуляторов андроида.
CGI-FCGI SAPI - это код, который никто не трогал года этак с 2001-го, и там вообще хрен знает как всё работает
Да вроде работает, у меня ж не боевой сервер )
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
так смысл wsl2 как-раз в том, что эта виртуалка с динамическим выделением памяти, не надо отрезать гигабайты оперативки, процессы просто откусывают из общей кучи сколько надо
вот у меня по диспетчеру задач до запуска wsl было 6,2 гб в строке "используется", когда запустил - 6,8
у тебя что, 2 гб оперативки, тебя 700 мб напрягают?
 
Последнее редактирование:

weregod

unserializer
Вчера добросил 2 до 8Гб (максимум, комбайн сильно старый), придётся поднять WSL, чего уж там )
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
ты в режимном объекте что-ли без права смены работы? :)
 
Последнее редактирование:

weregod

unserializer
ты в режимном объекте что-ли без права смены работы? :)
просто разъездяй и, временами, очень синегал )

кстати, WSL2 не спас отца русской демократии, вся та же фигня, что под Windows, придётся жить на Apache, пока руки не дойдут дальше расковыривать.
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
значит, у тебя на проде и локально разные конфиги, парсинг не может работать по-разному
 

weregod

unserializer
значит, у тебя на проде и локально разные конфиги, парсинг не может работать по-разному
не смог выудить у заказчика полный конфиг, он несильный шарун в этих делах, три куска разных прислал от конфига, я говорю "ты мне всё не показываешь либо там подключается что-то ещё" )))
 

fixxxer

К.О.
Партнер клуба
просто разъездяй и, временами, очень синегал )

кстати, WSL2 не спас отца русской демократии, вся та же фигня, что под Windows, придётся жить на Apache, пока руки не дойдут дальше расковыривать.
1) если ты все так же запускаешь cgi-fcgi, то не надо так делать, запускай php-fpm.
2) отключи в php.ini fix_pathinfo, тогда php не будет устраивать угадайку, а будет всегда брать точное значение SCRIPT_FILENAME.
3) добейся того, чтобы в fastcgi_param SCRIPT_FILENAME формировался корректный путь. Можно просто дампить для теста nginx-конфигом в location типа return 200 "подставляешь то, что у тебя в fastcgi_param". Таким же образом можно проверять, что конфиг корректен и ты попадаешь в нужные location-ы. Обрати внимание на всякие include-ы типа fcgi_params, чтобы там ничего не перебивалось поверх твоего.
 

weregod

unserializer
1) если ты все так же запускаешь cgi-fcgi, то не надо так делать, запускай php-fpm.
...
Конечно, fpm.
Благодарю за советы, уже поднял под виртуалкой китайскую панель, которая типа под продукт заточена, утащу конфиги оттуда, проанализирую.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
у nginx есть log level debug, я в сложных ситуациях его использую - в лог пишется большой протокол всех шагов парсинга url, редиректов и переменных
 
Сверху