Как стать автором
Обновить

Комментарии 17

> if ($request_uri ~ ^(.*)/index.(html|php)) { return 301 $1/$is_args$args; }
Почему бы этот if не убрать, попробовав завести соответствующий location?
Ну хотя бы потому что такой if нельзя заменить локейшеном. Цитирую документацию nginx

$request_uri — первоначальный URI запроса целиком (с аргументами)


Если провернуть тоже самое с локейшеном, то после редиректа запрос снова будет попадать в этот же локейшен и зациклится. Что вызовет ошибку 500.

Попробую наглядно…

запрашиваем /index.php
В обоих случаях и с if и location произойдёт редирект на /

Теперь запрос в / и $request_uri тут равно /, а значит редиректа не будет, в случае с локейшеном у нас отрабатывает директива index и происходит внутреннее перенаправление на index.php и снова идёт запрос на обработку в location, а там редирект)… и так до бесконечности)

Если вдруг Вы нашли способ избавиться от такого if и при этом не сломать работу сайта, поделитесь) Буду признателен. Уверен что не только я.
Решил всё таки заморочиться и сделать без if. Вот что у меня получилось
 map $request_uri $index {
  default "";
  "~(.*)/index.(html|php)" "$1/$is_args$args";
 }
 map $index $return {
  default "1";
  "" "";
 }

location @index { return 301 $index; }
location / { try_files $return$uri $return$uri/ $return/bitrix/urlrewrite.php$is_args$args @index; }


Пока применил у себя на дев-сайте. Страшно сразу выбрасывать на прод, помучаю сначала.

Позже добавлю в статью если нормально всё работать будет.

P.S. Немного поправил от первоначального состояния. Пересмотрите те кто смотрел первоначальный вариант комментария. Оттестирую этот вариант у себя и если всё хорошо. допишу его в статью.
Не нужно тащить fastcgi_index index.php и fastcgi_intercept_errors on в location'ы, достаточно указать на уровне server.
internal в большинстве location'ов лучше заменить на deny all.
Собственно это образец. И я его взял с дефолтного локейшена php в Debian. Суть моего подхода излагается выше и кратко, всего одним локейшеном.

Все бы хорошо, но как насчёт применения правил для автокомпозита заданных в админке битры?
Тех самых которые приводят к изменению .config.php из которого в bitrixvm генерятся правила для nginx..

Всё работает. Более того, куда лучше чем в битриксвм, то что они там напороли просто ужас у меня вызывает. Не надо думать что у них крутой конфиг потому он такой сложный. Всё куда проще)) Писал его явно тот кто не умеет в Nginx.

Вопрос не в том что круче, а в том как реализован проброс правил из .config.php в nginx…
В bitrixvm это делает perl скрипт вызываемый из ansible.

Правила все прописаны сразу, о каких правилах идёт речь?

Не первый день работаю с битрикс, и впервые слышу о файле, можно ссылочку на документацию о нём?

Спросили бы чего попроще, отдельно файлы никто не документирует. Поищу что-нибудь специально для вас

Да Вы шутите, в этой статье я как раз и написал как избавиться от этого колхозанства. Эти правила как раз и прописываются в мапах.
проблема в том что содержимое .config.php меняется в зависимости от настроек автокомпозита, которые пользователь делает просто в админке.
Хотелось бы чтобы оные прозрачно для юзера попадали в nginx, а в вашем случае все прибито гвоздями. Как в прочем и в bitrixvm (разрабы просят в menu.sh прожимать скриптик при изменении настроек автокомпозита).

Вполне возможно я не достаточно хорошо понял как оно работает и ваша реализация действительно полноценно работает.
Моя реализация работает полноценно, единственно что она не будет учитывать, это куки, в настройках композита можно задать кастомные куки при которых композит не должен отдаваться. Вот тут будет провал. Но собственно это можно и ручками задать. Да и если честно оно мне нигде не пригождалось.
Не подскажете, как при замене Apache на php-fpm настроить «Ускорение открытия страниц»?
При проверке пишет, что нужно либо подключить модуль компрессии, либо настроить его в веб-сервере.
gzip включил, но, похоже битрикс подразумевает что-то своё.
НЛО прилетело и опубликовало эту надпись здесь
нашёл, в чём была ошибка.
запишу, чтобы вопрос без ответа не висел.

У меня выстроена цепочка nginx (front with ssl) → nginx (on app server) → php-fpm → bitrix code
я настроил сжатие на nginx (on app server) и не настроил на nginx (front with ssl).

Т.е. надо было всего лишь включить gzip на граничном nginx.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории