LINUX.ORG.RU

Как установить кодировку Apache через .ebuild?

 , ,


0

1

Нормальные люди создают внутри приложения .htaccess файл, и вписывают туда строку `AddDefaultCharset UTF-8". (зачем мне web-приложение написано в предыдущей теме)

Но здесь есть три проблемы:

  1. с какого хрена вообще Apache использует ISO-8859-1, если в системе Gentoo по-умолчанию в файловой системе используется utf-8 ?
# eselect locale list
Available targets for the LANG variable:
  [1]   C
  [2]   C.utf8
  [3]   en_US.utf8
  [4]   POSIX
  [5]   ru_RU.utf8 *
  [ ]   (free form)

Проклятый RFC 2616 дотянулся…

  1. файлы .htaccess не всегда работают, а только тогда, когда их обработка сконфигурирована админом сервера Apache при помощи директивы AllowOverride
  2. эти файлы надо будет включать много раз в каждое приложение, это нарушает принцип DRY.

У меня была идея сделать отдельный .ebuild, который будет устанавливать файл /etc/apache2/modules.d/00_default_encoding.conf со строчкой AddDefaultCharset UTF-8 внутри, и добавлять этот ebuild в зависимости каждого web-приложения. Но у такого решения по-прежнему сохраняются недостатки 1 и 3.

В общем, надо как-то переделать .ebuild-файл для Apache, или добавить к нему Reverse Dependency, правильно? Или там уже всё есть, я просто использовать не умею?

Настроек нужных в USE-флагах я не вижу:

[ebuild   R    ] www-servers/apache-2.4.57:2::gentoo  USE="gdbm (split-usr) ssl suexec-caps systemd -debug -doc -ldap (-selinux) -static -suexec -suexec-syslog -threads" APACHE2_MODULES="actions alias auth_basic auth_digest authn_anon authn_core authn_dbm authn_file authz_core authz_dbm authz_groupfile authz_host authz_owner authz_user autoindex cache cgi cgid dav dav_fs dav_lock deflate dir env expires ext_filter file_cache filter headers include info log_config logio mime mime_magic negotiation rewrite setenvif socache_shmcb speling status unique_id unixd userdir usertrack vhost_alias -access_compat -asis -auth_form -authn_dbd -authn_socache -authz_dbd -brotli -cache_disk -cache_socache -cern_meta -charset_lite -dbd -dumpio -http2 -ident -imagemap -lbmethod_bybusyness -lbmethod_byrequests -lbmethod_bytraffic -lbmethod_heartbeat -log_forensic (-lua) -macro -md -proxy -proxy_ajp -proxy_balancer -proxy_connect -proxy_fcgi -proxy_ftp -proxy_hcheck -proxy_html -proxy_http -proxy_http2 -proxy_scgi -proxy_uwsgi -proxy_wstunnel -ratelimit -remoteip -reqtimeout -session -session_cookie -session_crypto -session_dbd -slotmem_shm -socache_memcache -substitute (-tls) -version -watchdog -xml2enc" APACHE2_MPMS="prefork -event -worker" LUA_SINGLE_TARGET="lua5-1 -lua5-3 -lua5-4" 7 308 KiB

Можно, конечно, сделать свой особый билд для Apache и в нём добавить патч, или использовать фичу user patches но что-то мне такое решение не кажется правильным, и включабельным в профиль для распространение на множество машин.

Я бы сказал, что «кодировка» - это такая фича, прикрученная сбоку. И эту фичу билды должны иметь возможность требовать через зависимости. Чтобы пакетный менеджер мог такие зависимости вычислить и установить ту кодировку, которую требуют сайты.
А если кодировок требуется несколько, то устанавливать несколько пакетов с кодировками, но конфигурировать их уже не глобально для инстанса Apache, а на приложения, которые её используют.

Пакетных менеджеров, вообще говоря, много. Поэтому логику выбора что и как конфигурировать можно было бы засунуть в отдельную утилиту, и написать к ней .eclass. А в билдах вызывать какую-нибудь функцию, чтобы она символизировала. Такая утилита есть, это webapp-config. Вы в ней установку кодировки видите? И я - нет.

★★★

Последнее исправление: Dimez (всего исправлений: 10)

в системе Gentoo по-умолчанию в файловой системе используется utf-8

У файловой системы нет кодировки. Имена файлов - просто последовательности байт с нулём на конце.

какого хрена вообще Apache использует ISO-8859-1

Где использует?

А ещё учти, что апач никто в здравом уме давно не ставит.

firkax ★★★★★
()
Ответ на: комментарий от firkax

У файловой системы нет кодировки.

Нормальные программы (это все, которые не apache и другие вебсерверы) уважают настройку локали данную им в ощущениях через переменную LANG. Поэтому пишут на диск в соответствующей кодировке, т.е. UTF-8.

Где использует?

Сделай страницу (с русским текстом) текстовым редактором, сохрани в UTF-8 (без тега meta charset), и затем отдай через апач, установленный по дефолту. Он не отправляет какой-то там http-header и всё, браузер неправильно видит страницу (крякозябрами).

учти, что апач никто в здравом уме давно не ставит.

Это их проблемы. Я нетакой.

Shushundr ★★★
() автор топика
Ответ на: комментарий от Shushundr

Он не отправляет какой-то там http-header

Он и не должен его отправлять, если ты ему не пропишешь в настройках. LANG - это язык пользовательского интерфейса программы, а не полезной нагрузки демона.

без тега meta charset

Ну и сам виноват. Кодировку надо указывать в самом документе. Вобщем апач тут ни при чём. А вот то что браузер неможет распознать, что там utf-8 - это уже косяк (браузера). Можно было понять, что иногда сложно отличить cp1251 от iso-8859-1 какого-нить, нужен анализ осмысленности получающихся текстов итд, но utf8 отличить от всего остального как раз тривиальная задача. И по-моему раньше браузеры это нормально умели, а потом сломали. Но указывать в <meta> всегда надо было.

Поэтому пишут на диск в соответствующей кодировке, т.е. UTF-8.

Нет, не «пишут на диск», а «показывают на экране и принимают с клавиатуры». У записи на диск уже нет никаких кодировок, просто пишут побайтово что есть.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

У записи на диск уже нет никаких кодировок, просто пишут побайтово что есть.

Не умничай. «Что есть» - это в какой кодировке хранится в памяти. В памяти может быть и не utf-8. Кроме того, по твоей логике, в аппаратной памяти тоже только байты (хотя на практике это не так, а зависит от используемого рантайма).

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

без тега meta charset

Ну и сам виноват. Кодировку надо указывать в самом документе.

Должен быть счастлив, а больше никому ничего не должен.

Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 2)