0
Другие записи за это число:
2016/11/02 - Отелло - история одного текста
<< предыдущая заметкаследующая заметка >>
02 ноября 2016
А есть специалисты по nginx?

UPD: Спасибо за советы! Проблема решена! Всё получилось:
try_files $uri $uri/?$args $uri/index.php?$args $uri/index.html $uri/index.htm $uri/index.shtml /index.php?$args;

БЫЛО:

Не поможете исправить давнишний баг в настройках nginx.conf?

Ситуация: у меня на сайте lleo.me стоит мой движок и еще есть очень много папок.

Все неизвестные запросы (типа papka/mamka/juchka) nginx должен отправлять на скрипт движка index.php — тот сам разберется со всеми существующими и несуществующими виртуальными именами.

Но если существует физический файл papka/mamka/juchka — следует отдать именно его, не беспокоя движок.

А если это физическая папка papka/mamka/juchka/ — то следует поискать в ней, вдруг там имеется корневой файл: index.php, index.htm, index.html и совсем старый зеноновский index.shtml, или совсем времен 90-x капслоком INDEX.HTM

Сейчас это не работает. Запросы типа:

http://lleo.me/e
http://lleo.me/e/

Выдают нам, как вы можете видеть, привет от nginx: "403 Forbidden nginx/1.4.6 (Ubuntu)", хотя должны были передавать управление движку. Они бы и передали, если бы папка /e/ не существовала, примерно вот так:

http://lleo.me/not-exist-folder

То есть, когда я указываю не реальную папку, а что-то не существующее в файловой системе физически, только тогда вот только тогда nginx передает управление движку, а тот исправно находит в своей базе искомое e/index.htm и честно его отрисовывает:

http://lleo.me/e/index.htm

В чем проблема — не знаю, я не спец в nginx.

Конфиг со всеми вышеописанными ошибками сейчас такой ИСПРАВЛЕННЫЙ КОНФИГ ДОЛЖЕН ВЫГЛЯДЕТЬ ТАК:

server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

root /var/www/website;

index index.html index.htm index.php index.shtml;

server_name lleo.me;
client_max_body_size 80M;

location /hidden {
deny all;
return 404;
}

location / {

try_files $uri $uri/ /index.php;
try_files $uri $uri/?$args $uri/index.php?$args $uri/index.html $uri/index.htm $uri/index.shtml /blog/index.php?$args;

location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;

# With php5-fpm:
fastcgi_pass unix:/var/run/home-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 50m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

fastcgi_param QUERY_STRING qnginx=$request_uri;

}
}

_}

Есть идеи?


UPD:

Путанно я объяснил. Суть в том, что при вызове комбинации букв, которая совпадает с реально существующей папкой, nginx кидается искать в ней index.php или index.htm и если не находит, так остро огорчается, что выдает ошибку. А должен — передать управление движку, как во всех остальных случаях. Как крайний вариант, меня даже устроит, если nginx вообще перестанет искать в папке index.php и index.htm — мне не проблема это сделать средствами своего движка.

UPD:

Любопытное заметил: первый раз обращение к 'lleo.me/pesni' (оставим примеры с '/e', а то в комментах люди думают, будто проблема только в папке '/e') вызывает переадресацию на 'lleo.me/pesni/', и только затем — ошибка 403:
$ wget http://lleo.me/e
--2016-11-03 00:20:29-- http://lleo.me/e
Resolving lleo.me (lleo.me)... 104.18.36.157, 104.18.37.157, 2400:cb00:2048:1::6812:259d, ...
Connecting to lleo.me (lleo.me)|104.18.36.157|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://lleo.me/e/ [following]
--2016-11-03 00:20:29-- http://lleo.me/e/
Reusing existing connection to lleo.me:80.
HTTP request sent, awaiting response... 403 Forbidden
2016-11-03 00:20:29 ERROR 403: Forbidden.

К сожалению, к движку nginx все равно не обращается ни в первый запрос, ни во второй.

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
архив понравившихся мне ссылок
Оставить комментарий
Windows Firefox
 Москва
1
0
Dixsi
Чет адски сложно. Разве это не банальный
error_page 404 = /;
?

Ну или не /, а свой особенный путь.
Linux Safari Chrome
 Москва
0
0
Леонит Каганофф
Блин, да неужели сложно?? Это же по-моему самая банальная из задач любого сайта, имеющего статический контент и некую cms. В apache это решалось одной строкой, почему же в nginx такие вдруг нерешаемые проблемы???
Windows Firefox
 Ростов-на-Дону
0
0
jone
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Можно перечислить все варианты index-файлов в try_files, но проще после try_files добавить
error_page 403 = /index.php;

Проверять заголовки удобней через curl -I uri

Почему делается внешний редирект '/e' на '/e/' это вопрос интересный; нужно же это, чтобы верно работали относительные ссылки на файлы внутри этого каталога 'e'.
Windows Firefox
 Москва
0
0
Dixsi
Под "сложно" я и имел в виду, что описано сложно, а решается просто.
Firefox
 Рязань
0
0
letmein
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Разрешения файловой системы?
Linux Safari Chrome
 Москва
0
0
Леонит Каганофф
Позволяют получать любой файл, если он существует.
Linux Safari Chrome
 Франция
0
1
Alexander Sorokopud
А чем вызвано столь трепетное отношение к движку? Может просто в нем, в самом index.php, поставить проверку существования запрошенного файла и переадресацию на него в случае успеха?
Linux Ubuntu Firefox
 Москва
0
0
Леонит Каганофф
Ну вы чудо-оптимизатор. И всё говно от style.sys и knopka.gif до полугигабайтных VIDEO.MOV пойдет отдаваться через PHP-движок? Отличная идея для сайта с многотысячной посещаемостью. Вдобавок как вы себе представляете слово "переадресация"? Header Location? Такая переадресация придет обратно в nginx.
Windows Firefox
 Самара
0
3
Олег Красота
Может просто переписать сайт на PHP? 21 век на дворе. Могу помочь.
Linux Ubuntu Firefox
 Москва
0
0
Леонит Каганофф
Чем это поможет?
Допустим, на сайте есть папка /rasskaz/ и в ней картинка к рассказу /razzkaz/fig1.jpg То есть, эту папку физически не убрать. Вопрос в том, как отобразить по этому адресу сам "рассказ".
При вызове httр://my-site.ru/razzkaz
nginx упорно пытается найти /rasskaz/index.php или /rasskaz/index.htm, а если не находит, выдает ошибку 403 Forbidden.
А должен бы передать управление CMS сайта на /index.php, как он это делает для любой комбинации букв, дял которой не существует физической папки.
Linux Firefox
 Самара
0
0
Виктор Сафронов
Я там ниже написал, директива index в качестве последнего аргумента может принимать файл со слэшем, пишем туда /index.php и после всех мытарств nginx уйдёт туда вместо ошибки.
Linux Safari Chrome
 Франция
0
0
Alexander Sorokopud
Да не, я не оптимизатор, даже не программист:) Я вообще кроме апача никогда ничем не пользовался, не говоря уже о том, что все сайты на перле, а там нет проблем с нагрузкой. Переадресовывал всегда джаваскриптом или в htaccess-e, меня это устраивало. Про nginx сам ничего не знаю, так что ждите специалистов:)
Linux Firefox
 Самара
0
0
Виктор Сафронов
Мне кажется, попытка открыть index.html, index.php, etc в существующей папке должна быть сделана через установку соответствующей директивы index http://nginx.org/ru/docs/http/ngx_http_index_module.html#ind[...]
А в try_files нужно только $uri и путь к дефолтному php-скрипту
Linux Firefox
 Самара
1
0
Виктор Сафронов
Неправильно понял проблему. Решается очень просто, в конец директивы index нужно дописать /index.php
Windows Firefox
 Ростов-на-Дону
1
0
jone
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
О, самое правильное решение! :)
Linux Ubuntu Firefox
 Москва
1
0
Леонит Каганофф
О! Виктор, спасибо большое! Кажется теперь я понял принцип.
Сработало так:

try_files $uri $uri/?$args $uri/index.php?$args $uri/index.html $uri/index.htm $uri/index.shtml /index.php?$args;

Не работало, например, с $uri/index.htm?$args - аргументы тут были лишние.

Остался последний вопрос, как же у меня работало раньше без $args все прочие виртуальные страницы?
Ведь стояло же просто:
try_files $uri $uri/ /index.php;
Однако все параметры QUERY_STRING передавало успешно.

Возможно, потому что ниже стояло такое указание:
fastcgi_param QUERY_STRING qnginx=$request_uri;

PS: Честно говоря, я в свое время задолбался эти qnginx= вычищать из строки параметров, приходилось во всех скриптах отдельные патчи для этого рисовать, но я думал, это обычный гемор, неизбежный для любого nginx-сервера:

if(isset($_GET['qnginx'])) {
if(strstr($_GET['qnginx'],'?')) {
list(,$_SERVER['QUERY_STRING'])=explode('?',$_SERVER['QUERY_STRING'],2);
list(,$a)=explode('?',$_GET["qnginx"],2); if(strstr($a,'=')) list($a,$b)=explode('=',$a,2); else $b=''; if($b===NULL) $b=''; if($a!='') $_GET[$a]=$_REQUEST[$a]=$b;
} else $_SERVER['QUERY_STRING']='';
unset($_GET["qnginx"]); unset($_REQUEST["qnginx"]);
}

Разве нет?
Linux Ubuntu Firefox
 Москва
0
0
Леонит Каганофф
вычеркнул вообще теперь эту директиву:
fastcgi_param QUERY_STRING qnginx=$request_uri;

Интересно, зачем она была? И много ли осталось в мире серверов, где такое же? Может и из движка патч вычистить?
Windows Firefox
 Ростов-на-Дону
0
0
jone
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
'/index.php' надо было добавить в директиву 'index', а не в 'try_files'.

В приведеном варианте даже на ненайденую картинку будет отдаваться html страница вместо 404.
Linux Ubuntu Firefox
 Москва
0
0
Леонит Каганофф
А у меня все уже работает!

Но как вы предлагаете написать директиву index?

index index.php index.html index.htm index.shtml /index.php?$args;

Так что ли?

В крайнем случае, не вижу ничего плохого, если на несуществующую картинку сервер будет передавать управление движку, а тот реагировать своей страницей 404. А как надо? Может, в движке страница с этим именем существует для каких-то надобностей? Я бы вообще меньше власти давал всяким Апачам и Нгинксам, их задача - быстро отдавать существующие файлы, всё, что касается несуществующих - тут бы уж лучше движку разбираться, что к чему.
Linux Safari Chrome
 Москва
0
0
Леонит Каганофф
А почему у меня все работает и чем это сейчас плохо?
Windows Firefox
 Ростов-на-Дону
0
0
jone
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Через try_files тоже рабочий вариант (я его тоже и предлагал вначале https://lleo.me/dnevnik/2016/11/02_nginx.html#231248). Особенность в том, что запрос передается в движок не только при осутствующем индекс-файле, но вообще при любом ненайденом файле.

Делать через index — это просто мелкая оптимизация.

Насчет args -- не все так просто. Оригинальное значение теряются после внутреннего редиректа, и тогда в движке его можно вытащить только из REQUEST_URI. Но, по моему, это правильней, чем повторять их в конфике типа index.php?$args
Linux Safari Chrome
 Москва
0
0
Леонит Каганофф
Так мне и нужно, чтобы любой несуществующий файл шел в движок. Или я чего-то не понимаю?
Windows Firefox
 Ростов-на-Дону
0
0
jone
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
А, увидел. Это я там только UPD прочитал, а "путанное" не читал и поэтому не так понял ;)

Но, try_files в текущем исполнении все-таки некорректен.

Во первых, там (кроме последнего элемента) следует указывать только относительные имена файлов, а не URI. Поэтому, нет смысла указывать ?$args -- такого файла все-равно небудет.

И во вторых, следует учесть, что обработка найденого файла ведется в текущем контексте (location).
В данной конфигурации это означает отдать файл как есть. Т.е., если будет обнаружен index.php, то будет отдано его содержимое (а не вызов движка).
Последний элемент -- это не файл, а URI или код ошибки. Для URI делается внутренний редирект и он обрабатывается в подходящем для него location.
См. https://nginx.org/ru/docs/http/ngx_http_core_module.html#try[...]

Таким образом, текущая вресия try_files эквивалентна следующему:
try_files $uri $uri/index.html $uri/index.htm $uri/index.shtml /blog/index.php?$args;


В директиве index на найденый файл делается внутренний редирект, поэтому там index.php обработается верно.
См. https://nginx.org/ru/docs/http/ngx_http_index_module.html#in[...]
Linux Ubuntu Firefox
 Москва
0
0
Леонит Каганофф
А можно вообще отключить услуги nginx по поиску INDEX в папках?
Windows Firefox
 Ростов-на-Дону
0
0
jone
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
По идее, должно быть так:
index /index.php ;
Linux Ubuntu Firefox
 Киев
0
0
Dmitry Lisitsin
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Привет, Ллео.

Попробуй вот так:

location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
<тут параметры фастцги, как и было>
}


Обрати внимание: в моем примере локейшены не вложены, в отличие от твоего.
Не забудь попросить сервер перечитать конфиги нгинкса после их изменения.
Linux Ubuntu Firefox
 Москва
0
0
Леонит Каганофф
Может его вообще отучить читать index самостоятельно?
Я пробовал закомментировать index в секции server, но после service nginx restart тот же эффект...
Linux Ubuntu Firefox
 Киев
0
0
Dmitry Lisitsin
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Странно.
Подобная конструкция у меня много где работает без нареканий.

А можешь выложить полный конфиг?
Linux Ubuntu Firefox
 Киев
0
0
Dmitry Lisitsin
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
А, не заметил про индексы в существующих папках.

Более правильно будет так:

location / {
index index.php index.htm index.html index.shtml INDEX.HTM
try_files $uri $uri/ /index.php?$args;
}
location ~ .php$ {
<тут параметры фастцги, как и было>
}


P.S. Не получилось отредактировать предідущий каммент. Твой редактор не пропустил код, а галочки "хтмл" я там не нашел.
Linux Ubuntu Firefox
 Москва
0
0
Леонит Каганофф
Не возымело эффекта.
Mac Safari Chrome
 Новая Зеландия
0
0
lasc
Это точно весь конфиг? там скобочки лишнии как минимум
Linux Ubuntu Firefox
 Москва
0
0
Леонит Каганофф
Нет, там еще сверху две секции для разделов /dnevnik и /blog
Linux Ubuntu Firefox
 Москва
0
0
Леонит Каганофф
Да, я добавил еще секцию server
Linux Firefox
 Белоруссия
0
0
Я забыл подписаться, да
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
То есть "e" — существующая папка, в которой нет индексного файла, и в этом случае надо отдать управленте движку?
Linux Ubuntu Firefox
 Москва
0
0
Леонит Каганофф
Именно!
Linux Safari Chrome
 Белоруссия
0
0
Я забыл подписаться, да, теперь с телефона
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
По идее, нужно убрать $uri/ из try_files и на его место поставить $uri/index.php $uri/index.htm $uri/index.html et cetera. Это даст nginx понять, что пытаться листить директорию не надо. В противном случае ($uri/ в try_files и список в index), он будет искать перечисленное в index, и если не найдет, то в зависимости от autoindex либо вывалит список файлов (чего не нужно), либо скажет 403 (что есть, но чего тоже не нужно).
Windows Safari Chrome
 Иваново
0
0
maniac
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
location / {
try_files $uri $uri/index.html?$args $uri/index.php?$args =404;
}

PS: Use Google, Luke!
Linux Ubuntu Firefox
 Москва
0
0
Леонит Каганофф
Спасибо, теперь вместо ошибки 403 выдает ошибку 404 :)
К работе с движком дело не переходит ;)
Linux Safari Chrome
 Белоруссия
0
0
Я забыл подписаться, да, теперь с телефона
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Попробуйте /index.php вместо =404
Windows Safari Chrome
 Иваново
0
0
maniac
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Но мог и наврать. Взяло за живое. Попробую сегодня потеребонькать
Windows Firefox
 Кременчуг
0
0
Dmitrij
Нужно чтобы он 404 перенаправлял на index.php
Что-то напдобие вот этого http://joxi.ru/p27907Mh0lNqMr
Но точно могу дать конфиг завтра, там только nginx и четко перенаправляет на index.php.

Когда Нестле тестировал мой сайт на безопасность, использовали такой запрос http://example.com/logs/access.log/ on this server. Your IP [...] %20has%20been%20blocked.%20Please%20send%20your%20username%20%2f%20password%20to%20www.hp.com %20for%20details.%20Your%20ip%20

И из 3-х серверов только один нормально отработал. Отослал все на index.php. Один системное сообщение 404 выдал, второй вообще подменил текст на экране (Parameter Tampering: Content Spoofing).
http://joxi.ru/xAeD70zfYzXGd2
Linux Ubuntu Firefox
 Москва
0
0
Леонит Каганофф
КТО тестировал сайт?!! Нестле?! И в чем тест? ;)))
Запрашивал /logs/access.log? И сервер типа ему отдал его? ;)))
Linux Ubuntu Firefox
 Кременчуг
0
0
Dmitrij
1. Да, Нестле. Они тестирую каждый сайт, который для них делается. Я делал несколько промо сайтов. Используют для этого ПО от Hewlett Packard. Тестов на безопасность множество.
2. Один из них это запрос, который я написал выше. Это проверка на так называемый Parameter Tampering: Content Spoofing. Это когда текст с адресной строки попадает на экран браузера и используется для выманивания паролей, денег и прочее (см. скрин).

3. Вот мой конфиг, который направляет все запросы на фреймворк (на его index.php)
http://joxi.ru/EA4zgv7sDJvg6m
Linux Safari Chrome
 Москва
0
0
Леонит Каганофф
Текст с адресной строки попадает на экран, шел 2016... Я думал, такие проблемы остались только на школьных уроках информатики.
Linux Safari Chrome
 Кременчуг
0
0
Dmitrij
Да хоть 2030. Неумелая настойка сервера приводить к бедам. Как говорится: на каждую хитрую ж*пу найдется свой х** с резьбой, а на каждый х** с резьбой найдется своя ж*па с лабиринтом.
Mac Safari Chrome
 Санкт-Петербург
0
0
alik
вот к чему эксперименты приводят
403 Forbidden

nginx/1.4.6 (Ubuntu)
это на заглавной
upd: уже норм
Windows Firefox
 Санкт-Петербург
0
0
anonymouse69
Поиск, кстати, странный, искал "ода роботам"(это например), так не находил вообще, даже с добавкой "f5:", видимо баг движка.
Linux Ubuntu Firefox
 Москва
0
0
Леонит Каганофф


Windows Firefox
 Санкт-Петербург
0
0
anonymouse69
Ага, а ничего, что у меня это выглядит вот так? Я привык к нормальному поиску, а не через задницу в гланды.

Linux Safari Chrome
 Москва
1
0
Леонит Каганофф
Тут же тебе не Яндекс. Надо набирать только точное слово или словосочетание.
Windows Firefox
 Санкт-Петербург
0
4
anonymouse69
"F5: ода роботам" это охренеть неточное словосочетание, если кривожопый поиск, так бы сразу и признались.
Кстати, Леонид, а памяти "солнечного клоуна" Олега Константиновича Попова будет вывеска? Или он не либераст, а, значит, упоминания недостоин?
Linux Safari Chrome
 Москва
6
1
Леонит Каганофф
Точное сочетание с двоеточием. Претензии - к MySQL.
По поводу Олега Попова скорбим, очень грустно, да, великий талант. Целая эпоха. Зельдин тоже был великий актер. Но не следует делать на смерти звезд самопиар, оповещать все ветки программистов о своей великой скорби (и назойливо требовать этого от других), и уж тем более некрасиво заниматься политическими спекуляциями и кричать что-то про «либерастов« на свежей могиле как на трибуне. Возьмите себя в руки и скорбите тихо, как все - без истерик, грязи, хамства и самопиара.
Windows Firefox
 Мурманск
0
0
anonymouse69
Могилы ещё нет, есть мнение, будет похоронен в Германии.
Windows Safari Chrome
 Москва
0
0
audiotheater
Ллео, а библиотека по-прежнему не работает...
Linux Safari Chrome
 Красноярск
0
0
Леонит Каганофф
Я в Красноярске, еще какое-то время разобраться не смогу.
Windows Safari Chrome
 Краснодар
0
0
Дмитрий
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
RSS сломалось. "This page contains the following errors:

error on line 23 at column 7848: PCDATA invalid Char value 2
Below is a rendering of the page up to the first error.

Леонид Каганов: блог Wed, 02 Nov 2016 21:48:04 +0300 http://lleo.me/dnevnik/ Леонид Каганов: блог Binoniq 3.0 http://lleo.me/dnevnik/rssc http://lleo.me/dnevnik/rss.xml?skip=10 120 155 http://lleo.me/dnevnik/2016/11/02_nginx.html http://lleo.me/dnevnik/ Wed, 02 Nov 2016 21:48:04 +0300 http://lleo.me/dnevnik/2016/11/02_nginx.html"

TheBat! выдаёт "!03.11.2016, 05:24:06: RSS - http://lleo.me/dnevnik/rss.xml - Получен недопустимый XML (Папка: "\\RSS Subscriptions\Леонид Каганов: блог"; Детали: "В текстовом комментарии обнаружен недопустимый знак. / / Line: 23 / &gt;location ~ \.php$ {&lt;p style="")"


Началось вчера "!02.11.2016, 22:23:43: RSS - http://lleo.me/dnevnik/rss.xml - Получен недопустимый XML (Папка: "\\RSS Subscriptions\Леонид Каганов: блог"; Детали: "В текстовом комментарии обнаружен недопустимый знак. / / Line: 23 / text-align:justify;text-indent:5%;margin")"

всего комментариев: 62

<< предыдущая заметка следующая заметка >>