LINUX.ORG.RU

Apache2 ругается на bad header, отдаваемый cgi-скриптом

 , ,


1

1

Свежеустановленный и настроенный Apache2 на Debian 12 отказывается отображать (даёт Internal Server Error) вывод моего Bash-скрипта, который нормально работает на lighttpd: https://github.com/eugrus/isbn4wiki/blob/main/isbn4wiki.sh

В /var/log/apache2/error.log

[Tue Aug 22 23:49:34.735904 2023] [cgid:error] [pid 3390:tid 139933482198720] [client 192.168.10.50:52838] malformed header from script 'isbn4wiki.sh': Bad header: {{Cite book

В случае lighttpd (чужом от Wikimedia Toolforge) я делал такой конфиг (да и то не из-за ошибок bad header, а просто чтобы \n, а не <br> разбивал строки):

cgi.assign += ( ".sh" => "/bin/bash" )
setenv.add-response-header += ( "Content-Type" => "text/html; charset=utf-8" )
$HTTP["url"] =~ "\.sh$" { setenv.add-response-header = ( "Content-Type" => "text/plain; charset=utf-8" ) }

Как заставить Apache2 принимать от CGI вывод в plain text?

Или я вообще не там увидел суть ошибки?

Если в другие скрипты (которые генерят html, а не plain text) добавить

echo "Content-type: text/plain"

то HTML будет отображаться простым текстом, не давая 500 и bad header в логе.

Возможно, Апач аллергически реагирует на {{?

Пробовал после 10 строки скрипта добавить

echo "Content-type: text/plain"
  • не решило проблемы.

Вот мой текущий конфиг Апача:

# cat /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf

        AddHandler cgi-script .cgi .sh
        Options +Includes +ExecCGI
        AddOutputFilter INCLUDES .html
        ScriptAlias /cgi-bin/ /var/www/cgi-bin/

</VirtualHost>
★★★★★

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

Ответ на: комментарий от eugrus

Мне кажется, что echo пишет в вывод только один перевод строки, а нужно два. Другими словами, между заголовком и телом должна быть пустая строка. Попробуй ещё один echo добавить, уже пустой.

i-rinat ★★★★★
()

то HTML будет отображаться простым текстом, не давая 500 и bad header в логе.

Если будут любые ошибки, то ошибку выдаст сам сервер и до вызова скрипта дело не дойдёт. Так как сервер не знает какой контент генерит скрипт, то заголовок с типом контента отдано на откуп скрипту и сервер проверяет его выдачу, потому вам и надо сказать тип контента и дополнительный перевод строки для индакации завершения заголовков.

vodz ★★★★★
()