Erweiterte Apache 2-Konfiguration auf Unix-ähnlichen Systemen
() translation by (you can also view the original English article)
In einem früheren Tutorial haben wir uns einige der grundlegendsten, aber wichtigsten Apache-Konfigurationsanweisungen angesehen - wofür sie gedacht sind und wie sie an unsere Anforderungen angepasst werden können. Für eine sehr einfache Website (vielleicht eine mit nur wenigen statischen HTML-Seiten) sind diese einfachen Anweisungen möglicherweise alles, was Sie wissen müssen. Möglicherweise benötigen Sie jedoch eine komplexere Website. Heute werden wir uns einige erweiterte Anweisungen und Konfigurationseinstellungen ansehen.
Das Verhalten von Apache wird durch Einstellungen und Anweisungen gesteuert, die in Nur-Text-Konfigurationsdateien angewendet werden, die normalerweise mit der Erweiterung "
.conf
" enden.
Die wichtigste .conf
-Datei ist httpd.conf
, obwohl dies von Ihrer speziellen Installation und Linux-Distribution abhängt (z. B. könnte sie stattdessen als apache2.conf
bezeichnet werden). Diese Konfigurationsdateien gelten im Allgemeinen für den gesamten Server, auch wenn auf dem Server mehrere Websites gehostet werden.
Konfigurationsdateien pro Verzeichnis werden standardmäßig als ".htaccess
"-Dateien bezeichnet und befinden sich im öffentlichen Dokumentverzeichnis des Webservers. Diese ermöglichen die Anwendung bestimmter Anweisungen auf bestimmte Verzeichnisse und deren Unterverzeichnisse und nicht auf den gesamten Server und alle gehosteten Websites. Obwohl nicht empfohlen, können Sie den Namen der .htaccess
-Datei mithilfe der AccessFileName
-Direktive, die in httpd.conf
festgelegt werden kann, in einen anderen Namen ändern:
1 |
# |
2 |
# AccessFileName: The name of the file to look for in each directory |
3 |
# for additional configuration directives. |
4 |
# |
5 |
AccessFileName .htaccess |
Bitte beachten Sie, dass htaccess
keine Erweiterung ist. Es ist der Name der Datei. Unter UNIX-ähnlichen Betriebssystemen bedeutet der Punkt (.
) Vor einem Dateinamen, dass die Datei ausgeblendet ist.
In Anbetracht ihres Speicherorts im Dateisystem können nicht alle Anweisungen in .htaccess
-Dateien angewendet werden, da einige möglicherweise einfach nicht gültig sind. Jede Zeile in einer Konfigurationsdatei muss mit einer der folgenden Zeilen beginnen:
- ein
#
, das einen Kommentar anzeigt - eine gültige Richtlinie
- ein Leerzeichen
- eine leere Zeile
Wenn eine Zeile nicht mit einer der oben genannten Optionen beginnt, gibt Apache eine Fehlermeldung aus, anstatt den HTTP-Dienst zu starten. Daher ist es wichtig, dass Sie sicherstellen, dass die Serverkonfiguration gültig ist. Wenn sich eine Direktive über mehrere Zeilen erstreckt, beenden Sie jede Zeile mit einem Schrägstrich(\
), bevor Sie mit der nächsten Direktive fortfahren.
Flexibilität erhalten
Die wichtigste .conf-Datei ist httpd.conf.
Während Sie Ihre eigenen Änderungen an den Standardkonfigurationsdateien vornehmen, ist es am besten, diese Änderungen in externe Dateien aufzuteilen (natürlich mit aussagekräftigen Namen) und sie mithilfe der include
-Direktive in die Hauptkonfigurationsdatei aufzunehmen. Wenn es nicht möglich ist, Ihre Einstellungen von den Standardeinstellungen des Servers zu trennen, sollten Sie zumindest alte Einstellungen auskommentieren, bevor Sie neue einführen. Auf diese Weise können Sie bei Bedarf problemlos auf eine beliebige Dateiversion zurücksetzen und mit minimalem Aufwand auf eine neuere Version der Datei httpd.conf
aktualisieren. Alles, was Sie tun müssen, ist, die neue Version anstelle der alten zu kopieren und Ihre Includes am Ende der neuen Datei erneut einzufügen (oder zumindest Ihre alten Änderungen erneut anzuwenden, nachdem Sie die Standardänderungen in der neuen Datei auskommentiert haben). . Zum Beispiel:
1 |
. |
2 |
. |
3 |
. |
4 |
# End of default apache configuration |
5 |
|
6 |
#Beginning of your new configuration and settings |
7 |
|
8 |
# Include ports listing |
9 |
Include /etc/apache2/ports.conf |
10 |
|
11 |
# Include generic snippets of statements |
12 |
Include /etc/apache2/conf.d/ |
13 |
|
14 |
# Include module configuration: |
15 |
Include /etc/apache2/mods-enabled/*.load |
16 |
Include /etc/apache2/mods-enabled/*.conf |
Wie Sie dem obigen Beispiel entnehmen können, können Sie eine bestimmte Datei nach Namen, ein Verzeichnis (und alle darin enthaltenen Dateien und Unterverzeichnisse) oder mehrere Dateien mithilfe von Platzhaltern einfügen.
Erweitertes Setup
In meinem vorherigen Tutorial über Apache haben Sie einige grundlegende Anweisungen gelernt, die das Verhalten von Apache steuern. In diesem Tutorial werden einige erweiterte Anweisungen vorgestellt, beginnend mit <Directory>
.
Die <Directory>
-Richtlinie
Mit der Direktive <Directory>
können Sie Einstellungen und Direktiven angeben, die auf Verzeichnisse und Unterverzeichnisse angewendet werden sollen. Auf diese Weise können Sie alle möglichen Aufgaben ausführen, z. B. den Zugriff auf bestimmte Verzeichnisse und Dateien einschränken und unter anderem bestimmte Optionen für bestimmte Verzeichnisse aktivieren oder deaktivieren.
Die <Directory>
-Tags nehmen einen Pfad und schließen einen Block von Optionen ein, die auf dieses Verzeichnis und seine Unterverzeichnisse angewendet werden sollen. Hier ist ein Beispiel:
1 |
<Directory /> |
2 |
Options None |
3 |
AllowOverride None |
4 |
Order Deny,Allow |
5 |
Deny from all |
6 |
</Directory>
|
Das öffnende <Directory>
-Tag in diesem Beispiel gibt einen Pfad von /
an, dh das Stammverzeichnis und alle seine Unterverzeichnisse und Dateien. Die in den <Directory>
-Tags definierten Einstellungen gelten für den Pfad /
(im Wesentlichen alles im Stammverzeichnis).
Beachten Sie, dass htaccess keine Erweiterung ist. Es ist der Name der Datei.
Die Options
-Direktive deklariert, welche Serverfunktionen für das angegebene Verzeichnis gültig sind. In diesem Beispiel sind keine Optionen für den Pfad /
gültig. Sie können jedoch eine beliebige Anzahl von Optionen angeben, z. B. das Zulassen symbolischer Links, das Ausführen von CGI-Skripten, das Zulassen serverseitiger Includes und vieles mehr.
Die AllowOverride
-Direktive teilt dem Server mit, welche in den <Directory>
-Tags deklarierten Einstellungen überschrieben werden sollen, wenn sie in der .htaccess
-Datei zurückgesetzt werden. Wenn der Server eine .htaccess
-Datei findet, muss er wissen, welche in dieser Datei deklarierten Anweisungen frühere Konfigurationsanweisungen überschreiben können. Wenn AllowOverride
wie im obigen Beispiel auf None
gesetzt ist, werden keine Anweisungen überschrieben und Neudeklarationen in den .htaccess
-Dateien werden vollständig ignoriert.
Wenn die AllowOverride
-Direktive auf All
gesetzt ist, überschreibt jede in der .htaccess
-Datei neu deklarierte Direktive frühere Konfigurationsanweisungen. AllowOverride
kann bestimmte Direktiventypen annehmen, die überschrieben werden können, während der Rest ignoriert wird.
Deny
undAllow
steuern den Zugriff auf das im Eröffnungs-Tag angegebene Verzeichnis und werden durch dieOrder
-Direktive priorisiert.
Im obigen Beispiel bedeutet Order Deny, Allow
, dass allen Verbindungshosts oder IP-Adressen der Zugriff auf das Stammverzeichnis verweigert wird, mit Ausnahme derjenigen, die als gute Hosts deklariert wurden. Order Allow, Deny
bedeutet andererseits, dass allen Hosts und IPs Zugriff auf das Stammverzeichnis gewährt werden soll, mit Ausnahme derjenigen, die als fehlerhaft oder auf der schwarzen Liste deklariert sind.
Die Deny from all
verweigern erklärt, dass der Zugriff von allen Hosts verweigert werden muss. Da keine Whitelist folgt, haben keine Hosts oder IPs Zugriff auf das Stammverzeichnis (und dies sollte aus Sicherheitsgründen so sein). NUR zu Demonstrationszwecken zeigt das folgende Beispiel, wie der Zugriff von allen Hosts außer www.goodhost1.com
und www.goodhost2.com
verweigert wird:
1 |
<Directory /> |
2 |
Order Deny,Allow |
3 |
Deny from all |
4 |
Allow from www.goodhost1.com www.goodhost2.com |
5 |
</Directory> |
Beachten Sie, dass die Order
-Direktive den Vorrang der Regeln definiert. Daher verweigern wir zunächst allen Hosts den Zugriff und erlauben dann nur den Zugriff auf www.goodhost1.com
und www.goodhost2.com
. Alternativ können Sie die beiden Hosts in einer separaten Zeile wie folgt angeben:
1 |
<Directory /> |
2 |
Order Deny,Allow |
3 |
Deny from all |
4 |
Allow from www.goodhost1.com |
5 |
Allow from www.goodhost2.com |
6 |
</Directory>
|
Wenn Sie den Zugriff auf alle Subdomains des Hosts goodhost.com
zulassen möchten (z. B. sub1.goodhost.com
, sub2.goodhost.com
und sub3.goodhost.com
), können Sie einen partiellen Domainnamen angeben, um den Zugriff zu gewähren statt alle zulässigen Subdomains aufzulisten. Das folgende Beispiel zeigt Ihnen, wie:
1 |
<Directory /> |
2 |
Order Deny,Allow |
3 |
Deny from all |
4 |
Allow from goodhost.com |
5 |
</Directory>
|
Wenn Sie den Zugriff von allen außer einer bestimmten IP-Adresse im lokalen Netzwerk verweigern möchten, zeigt das folgende Beispiel, wie Sie dies tun können:
1 |
<Directory /> |
2 |
Order Deny,Allow |
3 |
Deny from all |
4 |
Allow from 192.168.2.103 |
5 |
</Directory>
|
Wenn Sie den Zugriff auf alle Hosts mit Ausnahme einiger schlechter Hosts zulassen möchten, können Sie Folgendes tun:
1 |
<Directory /usr/local/apache2/htdocs/> |
2 |
Order Allow,Deny |
3 |
Allow from all |
4 |
Deny from www.badbot1.com badbot2.com spamhost.com |
5 |
</Directory>
|
Das obige Beispiel öffnet das öffentliche Verzeichnis für alle verbundenen Clients mit Ausnahme von zwei fehlerhaften Bots und einem Spam-Host. Beachten Sie die Verwendung entweder des gesamten Domainnamens oder des partiellen Domainnamens in der Host-Blacklist.
Ähnlich wie <Directory>
ist <DirectoryMatch>
. Es enthält eine Gruppe von Anweisungen, die nur für das angegebene Verzeichnis und seine Unterverzeichnisse gelten. Anstatt einen Pfad anzugeben, wird ein regulärer Ausdruck als Argument verwendet.
Indexes und DirectoryIndex-Direktiven
Wenn Sie eine Website besuchen, geben Sie häufig nur den Domainnamen ein, ohne eine Seite anzugeben (z. B. www.example.com
im Gegensatz zu www.example.com/index.html
). Der Grund dafür ist, dass der Server normalerweise immer die Standardseite anzeigt.
Diese Funktionalität wird durch die
DirectoryIndex
-Direktive auf dem Webserver geregelt. Es teilt dem Server die Standardseite mit, mit der er antworten soll, wenn in der URL keine Datei angegeben ist.
DirectoryIndex
kann mehrere Werte annehmen (d.h. mehr als einen Dateinamen). Wenn der Server auf eine Anforderung stößt, die keine bestimmte Datei angibt, durchläuft der Server die vielen Werte nacheinander, bis er eine Datei mit dem Namen findet gleicher Name im angeforderten Verzeichnis.
1 |
<Directory /usr/local/apache2/htdocs/> |
2 |
DirectoryIndex index.php index.html |
3 |
</Directory>
|
Wenn ein Client nach einem Verzeichnis fragt, das keine der in der DirectoryIndex
-Direktive aufgelisteten Standarddateien enthält, antwortet der Server mit der Verzeichnisliste, einer Liste aller in diesem Ordner enthaltenen Dateien und Unterverzeichnisse. Dies kann möglicherweise ein Sicherheitsrisiko darstellen, da die Dateien und die Dateisystemstruktur des angeforderten Verzeichnisses verfügbar sind. Sie können dieses Verhalten vermeiden, indem Sie die Option Indexes
verwenden, um die Verzeichnisliste auf DocumentRoot
-Ebene (dem Stammverzeichnis der htdocs oder öffentlichen Dateien des Servers) zu verhindern. Wenn Sie Ordnerlisten für ein Unterverzeichnis unter DocumentRoot
anzeigen möchten, können Sie die Option Indexes
für diesen bestimmten Ordner aktivieren. Die folgende Auflistung zeigt dies:
1 |
<Directory /usr/local/apache2/htdocs/> |
2 |
Options -Indexes |
3 |
</Directory>
|
4 |
|
5 |
<Directory /usr/local/apache2/htdocs/sub-dir1/> |
6 |
Options Indexes |
7 |
</Directory></p>
|
Im obigen Beispiel werden Verzeichnislisten im öffentlichen Haupt-HTML-Ordner (in diesem Fall /usr/local/apache2/htdocs/
) und in allen Unterverzeichnissen deaktiviert und nur für /usr/local/apache2/htdocs/sub-dir1/
Unterverzeichnis.
Die <Files>
-Richtlinie
Während die Direktive <Directory>
die Berechtigungen oder Einschränkungen angibt, die auf ein bestimmtes Verzeichnis angewendet werden sollen, steuert die Direktive <Files>
die Einschränkungen und Berechtigungen für eine oder mehrere Dateien (Platzhalter müssen innerhalb eines Dateinamens verwendet werden, um mehrere Dateien anzugeben). Schauen Sie sich diese Liste an:
1 |
<Files ".htaccess"> |
2 |
Order allow,deny |
3 |
Deny from all |
4 |
</Files>
|
In diesem Beispiel wird die Direktive <Files>
verwendet, um zu verhindern, dass .htaccess
-Dateien von Webclients angezeigt werden. Das folgende Bild ist ein Screenshot dessen, was der Server reagiert, wenn Sie versuchen, die .htaccess
-Datei abzurufen, indem Sie etwas wie https://www.example.com/.htaccess
anfordern.



Ebenso begrenzt die <FilesMatch>
-Direktive den Umfang der eingeschlossenen Direktiven nach Dateinamen, genau wie die <Files>
-Richtlinie. Es akzeptiert jedoch einen regulären Ausdruck als Argument.
Die <Location>
-Richtlinie
Die Anweisung <Location>
funktioniert ähnlich wie die Anweisung <Directory>
, außer dass eine URL als Argument verwendet wird, im Gegensatz zu einem Pfad zu einem lokalen physischen Verzeichnis im Dateisystem. Dies bedeutet, dass mit <Location>
Inhalte außerhalb des Servers gesteuert werden können.
Es wird dringend empfohlen, die Anweisung
<Location>
nicht mit lokalen Dateisystemspeicherorten zu verwenden, da viele URLs möglicherweise derselben Datei zugeordnet sind.
Die <LocationMatch>
-Direktive begrenzt auch den Umfang der eingeschlossenen Direktiven nach URL. Wie die anderen "Match"-Direktiven akzeptiert es einen regulären Ausdruck als Argument.
Die Anweisungen <Limit>
und <LimitExcept>
Die Anweisung <Limit>
steuert, welche HTTP-Methoden (z. B. GET
, POST
usw.) zulässig sind. Wie im folgenden Beispiel zu sehen ist, verweigert die Anweisung <Limit>
die Verwendung der Methoden POST
, PUT
und DELETE
für alle Clientanforderungen, mit Ausnahme derjenigen, die von 50.57.77.153
stammen.
1 |
<Limit POST PUT DELETE> |
2 |
Order Deny,Allow |
3 |
Deny from all |
4 |
Allow from 50.57.77.153 |
5 |
</Limit>
|
Die Direktive <LimitExcept>
bietet die entgegengesetzte Funktionalität. Es steuert weiterhin, welche HTTP-Methoden zulässig sind, dies jedoch ausschließlich. Im folgenden Beispiel verweigert <LimitExcept>
den Zugriff auf alle Clientanforderungen mithilfe anderer HTTP-Methoden als GET
und POST
.
1 |
<LimitExcept GET POST> |
2 |
deny from all |
3 |
</LimitExcept>
|
Konfigurationsstruktur und Vorrang der Richtlinie
Es wird dringend empfohlen, die Anweisung
<Location>
nicht mit lokalen Dateisystemspeicherorten zu verwenden.
Die Leistung von Apache beruht auf der Möglichkeit, die Funktionen des Servers durch Module zu erweitern, die von anderen Programmierern geschrieben wurden. Daher können Anweisungen entweder im Apache-Kerncode oder in installierten Modulen festgelegt werden. Um die Wirkung und den Umfang einer Direktive zu priorisieren, unterteilt Apache ihre Konfigurationsstruktur in drei Ebenen:
- Konfiguration auf Serverebene
- Container-Direktiven
- Konfiguration pro Verzeichnis
Die Konfiguration auf Serverebene enthält die Standardanweisungen, die für den gesamten Server festgelegt wurden. Diese Anweisungen können dann durch Konfigurationsdateien pro Verzeichnis (.htaccess
-Dateien) oder innerhalb von Containeranweisungen (wie den Tags <Directory>
und <Files>
) überschrieben werden.
Dateien pro Verzeichnis befinden sich normalerweise in der Dateistruktur des öffentlichen Verzeichnisses (oder können dieser hinzugefügt werden). Der Inhalt steht Subadministratoren und Entwicklern zur Verfügung, die somit die Möglichkeit haben, sich mit der Serverkonfiguration zu beschäftigen, indem sie verschiedenen Teilen des Servers Anweisungen aller Art hinzufügen. Daher kann der Serveradministrator steuern, welche Anweisungen in diesen Dateien angewendet werden können und welche Anweisungen die Standardserverkonfiguration überschreiben können oder nicht.
Abschluss
Dieser Artikel war für Serveradministratoren gedacht, um eine Referenz für erweiterte Apache-Einstellungen und Konfigurationsoptionen bereitzustellen. Wie wir erfahren haben, können Sie diese Anweisungen entweder auf Serverebene oder auf Verzeichnisebene anwenden. Abhängig davon, wie und wo Sie diese Anweisungen festlegen, kombiniert Ihr Server diese Einstellungen zu einer einheitlichen endgültigen Konfiguration.