Skip to content

Apache2 mit mod_cgi und DirectoryMatch

Warum aktivieren wir CGI mit hilfe von DirectoryMatch..? Mit der Directive DirectoryMatch können wir Reguläre Ausdrücke übergeben. In unseren Fall verwenden wir /cgi-bin/ als Regulären Ausdrück. Das heisst, wir können in jedem belibigen Unterverzeichnis ein cgi-bin Verzeichnis erstellen und alle Dateien mit der Endung .cgi, .pl und .sh werden vom Apache dort ausgeführt.

CGI wird mit dem Apache Module mod_cgi bereit gestellt. Dieses Modul muss nur mit folgenden Befehl geladen werden.

root:~# a2enmod cgi

Nun erstellen wir für das CGI Modul eine Konfigurationsdatei.

root:~# vi /etc/apache2/conf-available/cgi-enabled.conf
# CGI settings (only allowed in /cgi-bin/ directory)
#
<IfModule mod_cgi.c>
    <DirectoryMatch "/cgi-bin/">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        AddHandler cgi-script .cgi .pl .sh
        Order allow,deny
        Allow from all
    </DirectoryMatch>
</IfModule>

Damit die Konfigurationsdatei für das CGI Modul auch systemweit geladen wird, aktivieren wir die Konfiguration wie folgt.

root:~# a2enconf cgi-enabled.conf

Nun erstellen wir unter /var/www/test/cgi-bin eine test.pl um CGI zu testen.

root:~# cd /var/www/test/cgi-bin
root:/var/www/test/cgi-bin# vi test.pl
#!/usr/bin/perl
print "Content-Type: text/html\n\nHallo Welt!\n";

Nun machen wir die CGI Datei ausführbar.

root:/var/www/test/cgi-bin# chmod 755 test.pl

Damit die Änderungen aktiv werden, müssen wir nur noch den Apache Webserver neu starten.

root:/var/www# systemctl restart apache2

In dieser oben beschriebenen Methode ist CGI für den kompletten Server aktiviert. Will man CGI nur für bestimmte Virtual Host einstellen, bindet man die cgi-enabled.conf einfach im entsprechenden vhost Datei mit Include ein. Dann sollte man natürlich die Konfiguration global mit a2disconf cgi-enabled.conf deaktivieren.

root:/var/www# vi /etc/apache2/sites-available/default
# default vhost
<VirtualHost *:80>

    ServerName localhost
    DocumentRoot /var/www

    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>

    <Directory /var/www>
        Options Indexes Includes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    # CGI einbinden
    Include /etc/apache2/conf-available/cgi-enabled.conf

    ErrorLog /var/log/apache2/error.log
    CustomLog /var/log/apache2/access.log combined

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

</VirtualHost>