Не так давно при работе с CMS Битрикс пришлось столкнуться со следующей задачей.
Как известно, для того чтобы Битрикс правильно работал в кодировке UTF-8 требуется, чтобы параметр mbstring.func_overload был выставлен в значение, отличное от 0 (чаще всего в 2).
Обычно этого можно достигнуть либо установкой значения параметра в php.ini, либо в соответствующих файлах .htaccess, либо в vhosts.conf (или файлах настроек конкретных хостов для Apache). Но бывают такие случаи, когда некоторым скриптам или библиотекам (один из примеров - PHPExcel), требуется, чтобы mbstring.func_overload был равен 0.
Как быть и что делать?
Если на хостинге стоит php ниже 5.2.8, то данная проблема решается использованием ini_set(). Если же версия php выше данной - читаем дальше.
Все операции проводились над файлом vhosts.conf httpd.
Допустим, виртуальный хост определен следующей записью:
Для этого воспользуемся директивой <Directory> и изменим запись следующим образом:
Этого достаточно для мирного "сосуществования" двух значений mbstring.func_overload. Но можно пойти и дальше.
Может случиться так, что скрипты придется расположить в административной панели Битрикса, то есть в папке /bitrix/admin/. Создание в ней еще одной папки (той же no_overload) и применение к ней директивы <Directory>, в общем-то, верное решение, если бы не одно но. На странице скриптов ссылки главного меню относительные, и потому будут выглядеть как /bitrix/admin/no_overload/ и вести на несуществующие страницы. Поэтому воспользуемся директивой <Files> и изменим запись так:
Итак, теперь для файла myscript.php, что в папке /bitrix/admin/ и только для него mbstring.func_overload выставлен в 0, на всем остальном сайте - в 2. Вот теперь можно работать.
И да - перезапустите httpd после внесения изменений ;)
Больше информации о директивах <Directory> и <Files>.
Как известно, для того чтобы Битрикс правильно работал в кодировке UTF-8 требуется, чтобы параметр mbstring.func_overload был выставлен в значение, отличное от 0 (чаще всего в 2).
Обычно этого можно достигнуть либо установкой значения параметра в php.ini, либо в соответствующих файлах .htaccess, либо в vhosts.conf (или файлах настроек конкретных хостов для Apache). Но бывают такие случаи, когда некоторым скриптам или библиотекам (один из примеров - PHPExcel), требуется, чтобы mbstring.func_overload был равен 0.
Как быть и что делать?
Если на хостинге стоит php ниже 5.2.8, то данная проблема решается использованием ini_set(). Если же версия php выше данной - читаем дальше.
Все операции проводились над файлом vhosts.conf httpd.
Допустим, виртуальный хост определен следующей записью:
<VirtualHost *:80> ServerName server.ru DocumentRoot /home/webmaster/server.ru ScriptAlias /cgi/ "/home/webmaster/cgi/" ScriptAlias /cgi-bin/ "/home/webmaster/cgi/" ErrorLog /var/log/httpd/server_errors.log Options -Indexes ErrorDocument 404 /404.php php_admin_value mbstring.func_overload 2 <IfModule mod_dir.c> DirectoryIndex index.php index.html </IfModule> <IfModule mod_expires.c> ExpiresActive on ExpiresByType image/jpeg "access plus 3 day" ExpiresByType image/gif "access plus 3 day" </IfModule> </VirtualHost>Требуется, чтобы для скриптов в некоторой папке no_overload в корне сайта параметр mbstring.func_overload был равен 0.
Для этого воспользуемся директивой <Directory> и изменим запись следующим образом:
<VirtualHost *:80> ServerName server.ru DocumentRoot /home/webmaster/server.ru ScriptAlias /cgi/ "/home/webmaster/cgi/" ScriptAlias /cgi-bin/ "/home/webmaster/cgi/" ErrorLog /var/log/httpd/server_errors.log Options -Indexes ErrorDocument 404 /404.php php_admin_value mbstring.func_overload 2 <Directory /home/webmaster/server.ru/no_overload> DirectoryIndex index.php index.html php_admin_value mbstring.func_overload 0 </Directory> <IfModule mod_dir.c> DirectoryIndex index.php index.html </IfModule> <IfModule mod_expires.c> ExpiresActive on ExpiresByType image/jpeg "access plus 3 day" ExpiresByType image/gif "access plus 3 day" </IfModule> </VirtualHost>
Может случиться так, что скрипты придется расположить в административной панели Битрикса, то есть в папке /bitrix/admin/. Создание в ней еще одной папки (той же no_overload) и применение к ней директивы <Directory>, в общем-то, верное решение, если бы не одно но. На странице скриптов ссылки главного меню относительные, и потому будут выглядеть как /bitrix/admin/no_overload/ и вести на несуществующие страницы. Поэтому воспользуемся директивой <Files> и изменим запись так:
<VirtualHost *:80> ServerName server.ru DocumentRoot /home/webmaster/server.ru ScriptAlias /cgi/ "/home/webmaster/cgi/" ScriptAlias /cgi-bin/ "/home/webmaster/cgi/" ErrorLog /var/log/httpd/server_errors.log Options -Indexes ErrorDocument 404 /404.php php_admin_value mbstring.func_overload 2 <Directory /home/webmaster/server.ru/bitrix/admin> <Files myscript.php> php_admin_value mbstring.func_overload 0 </Files> </Directory> <IfModule mod_dir.c> DirectoryIndex index.php index.html </IfModule> <IfModule mod_expires.c> ExpiresActive on ExpiresByType image/jpeg "access plus 3 day" ExpiresByType image/gif "access plus 3 day" </IfModule> </VirtualHost>
И да - перезапустите httpd после внесения изменений ;)
Больше информации о директивах <Directory> и <Files>.
Добырй день,
ОтветитьУдалитьСпасибо за полезную статью! Помогла но частично. У меня так же стоит задача в папке www/bitrix/adimn сделать папку у который overload должен быть 0. Вне папки Битрикс работает. Но в папке Битрикс ваш метод не работает, так же пробовал через files но тоже не действует.
Что можете еще посоветовать?
И еще все изменения делаю в файле /home/etc/httpd/bx/conf/default.conf
ОтветитьУдалитьДобрый день. Вообще, сходу сложно сказать в чем может быть проблема. Залейте на pastebin, например, конфиги, которые правите.
Удалить