Назад | Перейти на главную страницу

Как мне запустить каталог сценариев CGI, которым требуется PATH_INFO на Apache 2.4?

В Apache 2.2 я запускал веб-интерфейс CGI Mailman на VirtualHost, который имел:

    <Directory "/usr/lib/cgi-bin/mailman/">
               AssignUserId www-data www-data
               AllowOverride None
               Options ExecCGI
               AddHandler cgi-script .cgi
               Order allow,deny
               Allow from all

    </Directory>
    <Directory "/var/lib/mailman/archives/public/">
               AssignUserId www-data www-data
               Options FollowSymlinks
               AllowOverride None
               Order allow,deny
               Allow from all
    </Directory>
    <Directory "/usr/share/images/mailman/">
               AssignUserId www-data www-data
               AllowOverride None
               Order allow,deny
               Allow from all
    </Directory>

    ScriptAlias "/mailman/"  "/usr/lib/cgi-bin/mailman/"

Это сработало нормально. Недавно, возможно, после обновления Apache 2.4 в Jessie (2.4.10-10 + deb8u7) я обнаружил, что не получаю никакого контента от Apache. После того, как много почесал голову и отладил mailman (1: 2.1.18-2 + deb8u1), я обнаружил, что работает замена ScriptAlias ​​на кучу операторов ScriptAliasMatch и изменение Mailman для использования REQUEST_URI скорее, чем PATH_INFO поскольку PATH_INFO не определено. Возможно, это потому, что я ScriptAliasMatch, но если ScriptAliasMatch проглатывает компоненты конечного пути, это, казалось бы, ограничивает его полезность.

В частности, я взломал сайт для работы с довольно неэлегантным:

    <Directory "/usr/lib/cgi-bin/mailman/">
               AssignUserId www-data www-data
               AllowOverride None
               Options ExecCGI
               AddHandler cgi-script .cgi
               Order allow,deny
               Allow from all

    </Directory>
    <Directory "/var/lib/mailman/archives/public/">
               AssignUserId www-data www-data
               Options FollowSymlinks
               AllowOverride None
               Order allow,deny
               Allow from all
    </Directory>
    <Directory "/usr/share/images/mailman/">
               AssignUserId www-data www-data
               AllowOverride None
               Order allow,deny
               Allow from all
    </Directory>

    Alias "/mailman/images/" "/usr/share/images/mailman/"
    #       ScriptAlias "/mailman/"  "/usr/lib/cgi-bin/mailman/"
    ScriptAliasMatch "/mailman/admin/(.*)"  "/usr/lib/cgi-bin/mailman/admin"
    ScriptAliasMatch "/mailman/admindb/(.*)"  "/usr/lib/cgi-bin/mailman/admindb"
    ScriptAliasMatch "/mailman/confirm/(.*)"  "/usr/lib/cgi-bin/mailman/confirm"
    ScriptAliasMatch "/mailman/create/(.*)"  "/usr/lib/cgi-bin/mailman/create"
    ScriptAliasMatch "/mailman/edithtml/(.*)"  "/usr/lib/cgi-bin/mailman/edithtml"
    ScriptAliasMatch "/mailman/listinfo/(.*)"  "/usr/lib/cgi-bin/mailman/listinfo"
    ScriptAliasMatch "/mailman/options/(.*)"  "/usr/lib/cgi-bin/mailman/options"
    ScriptAliasMatch "/mailman/private/(.*)"  "/usr/lib/cgi-bin/mailman/private"
    ScriptAliasMatch "/mailman/rmlist/(.*)"  "/usr/lib/cgi-bin/mailman/rmlist"
    ScriptAliasMatch "/mailman/roster/(.*)"  "/usr/lib/cgi-bin/mailman/roster"
    ScriptAliasMatch "/mailman/subscribe/(.*)"  "/usr/lib/cgi-bin/mailman/subscribe"

Затем я исправил функцию Mailman, которая использует PATH_INFO для возврата к REQUEST_URI:

def GetPathPieces(envar='PATH_INFO'):
    path = os.environ.get(envar)
    if path is None:
        path = '/'.join(os.environ.get('REQUEST_URI').split('/')[3:]).split('?')[0]
    if path:
        if CRNLpat.search(path):
            path = CRNLpat.split(path)[0]
            syslog('error', 'Warning: Possible malformed path attack.')
        return [p for p in path.split('/') if p]
    return None

Я прочитал документацию по ScriptAlias ​​и mod_cgi и попытался убедиться, добавив в свой VirtualHost:

    AcceptPathInfo on

что не помогло. Я также просмотрел обширную конфигурацию apache для этого сервера и не нашел ничего подходящего.

Также, казалось бы, не актуально, но рядом находится wordpress .htaccess в DocumentRoot VirtualHost

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

У меня вопрос: как запустить неизмененную копию Debian Jessie Mailman против Apache 2.4. Или я обнаружил ошибку в Apache? Поведение почтальона кажется разумным.