В 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? Поведение почтальона кажется разумным.