• Как в Битриксе настроить редирект ссылок без слеша в конце на с ним?

    shambler81
    @shambler81 Куратор тега htaccess
    Владислав Старцев,
    уже много раз вижу такую шляпу
    кто вообще придумал этот редирект ?
    RewriteCond %{REQUEST_URI} !\?
    ? - не может физически быть в %{REQUEST_URI} поскольку не является частью урла
    собственно как и RewriteCond %{REQUEST_URI} !\&
    & - выделяется через RewriteCond %{QUERY_STRING}
    По факту все что тут работает
    RewriteCond %{REQUEST_URI} !\=
    Если не =, но простите а причем тут равно ? Скорее всего тот "мастер" что придумал сей редирект думал о GET параметрах, но они как я и говорил выше не попадают в REQUEST_URI
    Если не точка, а простите причем тут точка ?
    И того 2 условия в принципе не выполнимы
    2 из них идиотские и не удовлетворяют тз

    Все что остается это предпоследнее не слеш в конце
    И сам реврайт рул.
    То есть из всего правила работает 10% остальные 90% это мусор идиота

    Теперь разберемся
    Как бы это должно было быть на самом деле
    Тут все сложнее поскольку есть пара условий в которых нельзя убирать слеш.
    RewriteCond %{REQUEST_URI} \..+$
       # Если файл содержит точку.
    RewriteCond %{REQUEST_FILENAME} !-d
       # И это не директория.
    RewriteCond %{REQUEST_FILENAME} -f
       # Является файлом.
    RewriteCond %{REQUEST_URI} ^(.+)/$
       # И в конце URL есть слеш.
    RewriteRule ^(.+)/$ /$1 [R=301,L]
       # Исключить слеш.


    Оданко не все так просто, сематнически правильно именно закрывать слешем
    НА СЕО не влияет ни то ни то, это 100% инфа, влияет отсутствие редиректов с одного на другое что может дать два урла.
    НО какой именно урл со слешем или нет, не влияет!

    НО семантически URL должне быть закрыт
    однако слеш после имени файла дает 404, если это просто файл.
    Так что нам нужно разделить реальные файлы и урлы созданые ЧПУ

    добавив вот такое правило.
    ############################################################################
    #### Добавляем слеш(/), если его нет, и это не файл.                    ####
    ############################################################################
    RewriteCond %{REQUEST_URI} !(.*)/$
       # Если слеша в конце нет.
    RewriteCond %{REQUEST_FILENAME} !-f
       # Не является файлом.
    RewriteCond %{REQUEST_URI} !\..+$
       # В URL нет точки (файл).
    RewriteCond %{REQUEST_URI} ^(.+)$
     # В URL есть хоть один символы
    RewriteRule ^(.*)$ $1/ [L,R=301]
       # Добавляем слеш в конце.


    И того сразу два правила, притом именно в такой последовательности должны быть в .htccess
    за врея работы я видил много горе СЕО специалистов рекоменующие вот такие шляпы, да и редиректы 90% которого не может сработать физически.
    так же часто видил удаление аперкейсов в урлах ( чего разумеется тоже делать нельзя)
    редиректы на хтмл мативируя тем что гугл думает что это статика и лучше их валидирует и тд и тп.
    Все это лечится одним, удалением этого сотрудника и наемом более квалифицированного сеошника, а не плавающего товарищя в анабиозе.
    Ответ написан
    6 комментариев
  • Вывод нормальных url в Битриксе?

    smilingcheater
    @smilingcheater
    Открыть админку, перейти в раздел:
    Настройки - Настройки продукта - Настройки модулей - Главный модуль
    Первая вкладка, группа настроек "Файлы", поставить галку "Сохранять исходные имена загружаемых файлов". Чтобы не было проблем с кириллическими названиями желательно поставить так же ещё 2 галки ниже этой - "Производить транслитерацию имени файла", "Автоматически заменять невалидные символы в именах загружаемых файлов"
    Ответ написан
    1 комментарий
  • Как докачать модули после смены редакции 1С-Bitrix со "Старта" на "Стандарт"?

    alexyarik
    @alexyarik
    Битрикс разработчик
    зайдите в настройки - модули и нажмите на него установить
    Ответ написан
    Комментировать
  • PHP скрипт палит базу при неверном подключении?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    А теперь правильный ответ.

    PDO - не единственная библиотека в составе РНР. И не она одна выдает ошибки.
    Поэтому искать решение, специфическое для PDO просто глупо. Ошибка при отправке емейла откроет данные для соединения с почтовым сервером - и т.д.

    Отключать показ ошибок надо для всего РНР целиком.

    И делается это очень просто. Добавляешь всего одну строчку в начало файла:

    ini_set('display_errors', 0);

    и всё - ни одна ошибка не появляется на экране! Причем это будут любые ошибки, а не одна конкретная.

    Но тебе всё равно нужно знать, в чем проблема. Чтобы её исправить. Поэтому сам текст ошибки надо писать в лог на сервере. Это тоже делается одной командой:

    ini_set('log_errors', 1);

    Всего две команды, и больше ничего менять в коде не надо.
    Они скроют текст ошибки от пользователя. но сохранят для того чтобы ты мог понять, в чем проблема.
    Ответ написан
    24 комментария
  • Сверстать такой шаблон?

    @archelon
    Открываете сайт foundation, изучаете документацию; при необходимости, смотрите уроки и туториалы; верстаете.
    Ответ написан
    Комментировать
  • Как сделать поиск текста по включаемым областям?

    gtronic
    @gtronic Автор вопроса
    Учусь веб-разработке
    Решение оказалось не таким уж простым.
    Добавить включаемые области в индекс поиска можно но это требует вмешательства в процесс индексации.
    для этого в /local/php_interface/init.php добавляется следующий код:
    <?
    AddEventHandler("search", "BeforeIndex", Array("MyClass", "BeforeIndexHandler"));
    class MyClass
    {
       private $file_abs_path = "";
    
       function BeforeIndexHandler($arFields)
       {
          $io = CBXVirtualIo::GetInstance();
    
          if($arFields["MODULE_ID"] == "main")
          {
             list($site_id, $file_rel_path) = explode("|", $arFields["ITEM_ID"]);
             $file_doc_root = CSite::GetSiteDocRoot($site_id);
             $file_abs_path = preg_replace("#[\\\\\\/]+#", "/", $file_doc_root."/".$file_rel_path);
             $f = $io->GetFile($file_abs_path);
             $sFile = $f->GetContents();
             if(isset($sFile) && $sFile != "")
             {
                $replacer = new MyClass;
                $replacer->file_abs_path = $file_abs_path;
                $sFile = preg_replace_callback("/<\\?\\\$APPLICATION->IncludeComponent\\(\\s*\"bitrix:main.include\",(.*?)\\?>/mis", array($replacer, "replace"), $sFile);
                $arFields["BODY"] = CSearch::KillTags($sFile);
             }
          }
          return $arFields;
       }
       function replace($matchParams)
       {
          $io = CBXVirtualIo::GetInstance();
    
          if (preg_match("/\"AREA_FILE_SUFFIX\"\\s*=>\\s*\"(.*?)\",/", $matchParams[1], $match))
          {
             $slash_pos = strrpos($this->file_abs_path, "/");
             $sFilePath = substr($this->file_abs_path, 0, $slash_pos+1);
             $sFileName = substr($this->file_abs_path, $slash_pos+1);
             $sFileName = substr($sFileName, 0, strlen($sFileName)-4)."_".$match[1].".php";
    
             $f = $io->GetFile($sFilePath.$sFileName);
             return $f->GetContents();
          }
          return "";
       }
    }

    После того, как вставите код не забудьте сделать переиндексацию.
    Этот код работает при подключении включаемых областей с указанием параметра AREA_FILE_SUFFIX. В иных случаях он требует доработки.
    В любом случае, поиск по включаемым областям в битриксе возможен.
    Ответ написан
    1 комментарий
  • Автоответ на форму обратной связи?

    Adamos
    @Adamos
    Человек заполняет форму: email, телефон, имя.
    Ему на почту приходит автоматически ответ и прикрепленный файл.

    А если человек пишет не свой e-mail или вообще не пишет, а настропалил робота на ваши формочки, то вы ему на халяву организовали спам-бота со своего почтового ящика.
    Капча в Битриксе, если что - говно.
    Ответ написан
    Комментировать
  • Автоответ на форму обратной связи?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Для этого нужно использовать Почтовую систему.

    Можно написать свой функционал, используя API. Или использовать уже имеющийся, например WEB-формы:.
    https://dev.1c-bitrix.ru/user_help/service/form/fo...
    https://dev.1c-bitrix.ru/learning/course/index.php...
    Ответ написан
    Комментировать
  • Какой лучше путь для шаблона компонента использовать при установке модуля битрикс?

    @vldud
    Первый вариант. Либо вообще:
    /bitrix/components/пространство_имён/название_компонента/templates/название_шаблона/
    Ответ написан
    2 комментария
  • Почему ссылки в шаблоне Битрикс задаются от корня сайта?

    ssenj
    @ssenj
    HTML, CSS, PHP, WordPress, Bitrix
    Передаю значение yandex.ru, а ссылка становится: http:/site.ru/yandex.ru

    Если хотите получить ссылку на яндекс, то попробуйте передать значение с протоколом:
    http://yandex.ru
    Ответ написан
    Комментировать
  • Минимизация CentOS?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Пока не поздно, поменяйте тему с "Минимизация CentOS" на "Максимизация LFS или Генту до гуя и красивостей".
    Ответ написан
    Комментировать
  • Битрикс, сбрасывается корзина?

    alex-1917
    @alex-1917
    Если ответ помог, отметь решением
    Для авторизованных корзина хранится в БД, для всей прочей левой публики, не авторизованной и шпыняющей в корзину не глядя, корзина эта хранится в сесии.
    Авторизовался - сессия заменилась на сессию из БД, корзина соответственно подгрузилась из БД.
    Ушел с браузера -сессия сдохла.
    Это не чудеса, это ты курс администратора магазина Битрикс не прошёл, зачем тогда в битрикс лезть?
    лезь в вордпрес, джумлу, прочее гавно...
    Ответ написан
    Комментировать
  • Самый простой способ реализовать real time MySQL (без firebase!) базу данных для маленького приложения?

    @xfg
    Базу данных можно выбрать любую. Она не играет роли в realtime приложениях. Позвольте вам немного объяснить. Для передачи данных между клиентом и сервером в браузере существует всего два протокола. HTTP и Websocket. Firebase не магия и также использует их. Если браузером не поддерживается Websocket, то firebase откатывается на HTTP. Используя общераспространенный подход к разработке на PHP у вас не получится использовать websocket протокол поскольку типичные PHP приложения не живут дольше 1 запроса. Соответственно да, в таком варианте остается только ajax. Но точно также работает и firebase если в браузере нет поддержки websocket, так работает facebook, telegram и много всего остального. Они используют long-polling. Клиент отправляет запрос к скрипту на сервер, скрипт в цикле опрашивает хранилище mysql или более продвинутый вариант mysql+redis (чтобы не грузить запросами mysql) и пока данных не будет, цикл так и продолжит крутиться, для клиента это просто выглядит как повисший запрос к серверу. Как только данные появляются, они отправляются на клиент, соединение разрывается, а клиент сразу же отправляет новый запрос.

    Есть развитие этой идеи. Называется HTTP Streaming. Отличие от long-polling в том, что после отправки данных клиенту соединение не разрывается, а сервер продолжает отправлять последующие данные по этому же соединению. Соединение разрывается по таймауту. Минус в том, что прокси-сервера могут кешировать небольшие пакеты данных и данные нужно раздувать например пробелами, чтобы пакет данных достигал минимального размера и был способен пробить кеш прокси-сервера. Плюс в том, что если у вас данные для клиента появляются скажем с переодичностью раз в секунду, то не будет происходить постоянного открытия-закрытия соединения как при long-polling.

    Есть вариант, когда можно реализовать небольшую прослойку на socket.io. Ваше PHP приложение пишет данные для клиента например в redis. Приложение на socket.io подписывается на redis. Когда PHP что-то отправляет в redis, то socket.io мгновенно об этом узнает и рассылает это событие по websocket протоколу всем подключенным клиентам. Минусы. Раздуваете стек. Нет консистентности данных между записью в основное хранилище (mysql/postgre/mongo/etc) и redis. Соответственно может возникнуть ситуация, когда данные записали, но в redis событие не ушло. Поменяете местами, будет наоборот, событие есть, данных в базе нет.

    Вариантов в целом очень много. Всё это называется Comet. Вам проще всего реализовать long-polling.

    А реал-тайм база, которая умела пушить данные клиенту по tcp протоколу (но не в браузер) была и называлась она rethinkdb.com. Ныне не развивается. IP в России заблокирован. На сайт можно сходить по VPN.
    Ответ написан
    3 комментария
  • Как подключить языковые константы к header.php?

    В начале header

    IncludeTemplateLangFile(__FILE__);

    В нужном месте

    <?=GetMessage('CONST')?>

    Либо на новом ядре:

    <?
    use Bitrix\Main\Localization\Loc;
    
    Loc::loadLanguageFile(__FILE__);
    ?>


    <? echo Loc::getMessage("CONST");?>
    Ответ написан
    4 комментария
  • Правильно ли я пониманию, что архитектура "битрикс управление сайтом" несколько кривая?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если смотреть на вещи реальнее скорее это ошибка в документации. По сути архитектура битрикса это не MVC, это некий набор из конкретных архитектур и стоит рассматривать их независимо. Если говорить о Компонентах, Моделях и Шаблонах, то битрикс скорее это MVVM модель, где компонент - ViewModel, шаблон это View, а Model это фундаментальная часть данных без бизнес-логики.

    Означает ли это что данная архитектура кривая? Нет, вовсе не означает. Просто она реализует совершенно иной подход, который чужд многим разработчикам из мира фреймворков и моно-проекта.
    Ответ написан
    Комментировать
  • Правильно ли я пониманию, что архитектура "битрикс управление сайтом" несколько кривая?

    Я бы сказал - своеобразная.
    Там насколько мне помнится, написано что компонент - контроллер, а его шаблон это вьювер.
    Да, формально, если разобраться, так и есть.
    На практике у этого подхода есть как недостатки, так и преимущества.
    Ну к примеру мы говорим что якобы все три части у нас независимы, но на самом деле View всегда связаны с Controller, а Controller почти всегда связан с Model. В Битриксе не стали делать вид что это не так - компоненты это части модулей, а шаблоны не отделимые, хотя и сменяемые части компонентов. В большинстве случаев это соответствует практическим кейсам.

    Но никто не заставляет вас следовать этим рекомендациям. За свою жизнь разработчиком я видел многое и чаще всего это были какие-то попытки реализовать отдельные модели поверх Bitrix API, я и сам не однократно так делал и даже предпринял попытку обобщить этот опыт, пока не завершенную.
    Но я видел так же например и ZendFramewormk поверх Bitrix и вполне классическим MVC.
    Поэтому архитекутра Битрикс не приговор.

    А ноги такой архитектуры растут из попытки сделать CMS с которой, хотя бы в теории, мог справится человек совсем без подготовки. Надо же что-то показывать на презентациях. Но это не значит что вы обязаны делать и свои продукты для презентаций.
    Рекомендации же делать именно так нужны для того, что бы вы делали проект, максимально привычный для любого битрикс-разраба. Когда я впервые столкнулся со связкой Bitrix-Zend я честно говоря опешил, и если бы не опыт с дргуими фреймворками и CMS долго бы тупил...
    Ответ написан
    Комментировать
  • Куда устанавливаются доп. решения для Битрикс?

    @kudis
    Bitrix developer
    Всё зависит от решения.
    Модули в /bitrix/modules/ или /local/modules/
    Гаджеты в /bitrix/gadgets/ или /local/gadgets/
    и т.д.
    Полноценные решения состоят из множества элементов и, при установке, раскидывают свои части по нужным местам и регистрируют модули, классы, обработчики...
    Ответ написан
    Комментировать
  • Как настроить сбербанк эквайринг на битрикс?

    alexyarik
    @alexyarik
    Битрикс разработчик
    На почту поддержки Сбербанка (ту с которой были вам присланы данные доступа для тестового режима) отправляете заявку на перевод в боевой режим.
    В заявке указываете ссылки на страницы со следующими данными:
    Подаем заявку на переход на боевую среду.
    КОНТАКТНЫЕ ДАННЫЕ ОРГАНИЗАЦИИ
    -страница контакты
    ОПИСАНИЕ СФЕРЫ ДЕЯТЕЛЬНОСТИ
    - обычно каталог
    Пример описания товара, цен и т.д.
    - любая заполненная детальная страница товара
    ПОЛИТИКА КОНФИДЕНЦИАЛЬНОСТИ И ПОЛЬЗОВАТЕЛЬСКОЕ СОГЛАШЕНИЕ
    -политика конфинденциальности
    - пользовательское соглашение
    СПОСОБЫ ОПЛАТЫ, УСЛОВИЯ ДОСТАВКИ ТОВАРА, ОПИСАНИЕ ПРОЦЕССА ПЕРЕДАЧИ ДАННЫХ
    - страница оплаты и доставки
    ОПИСАНИЕ ВОЗВРАТА ТОВАРА/УСЛУГИ
    - страница возврата товара
    Ответ написан
    2 комментария
  • Flex-basis auto, 100% и IE. Не работает. Баг или фитча.. Как правильно?

    SmthTo
    @SmthTo Куратор тега CSS
    Все перепёлки мира будут оплакивать мою смерть.
    Это баг IE11. Лечится указанием flex-basis, кроме auto. Обычно ставится либо нужное значение, либо просто 100% в качестве эдакого аналога auto.

    Кстати, если нужно использовать calc() вместе с flex-basis, то нужно писать его отдельно (второй пример), а не в составе свойства flex.

    Вот разные варианты, которые работают в IE11:



    Ещё вместо 100% можно поставить 0% (именно с процентом, а не просто нуль) или 1px, но там были какие-то баги в этом случае в других браузерах (в Chrome какой-то версии текст за пределы такого блока выходил, например).

    Если по какой-то причине нужно такое сделать только в IE11, то нужно код обернуть вот в этот хак:
    @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
        /* Код тут будет работать только в IE10 и IE11 */
    }
    Ответ написан
    4 комментария