Ich sperre schon lange einige meiner privaten und beruflichen Seiten mit Hilfe einer .htaccess-Datei.
Dazu wird – wie den meisten bekannt sein sollte – eine Textdatei mit dem Namen .htaccess in das Webserver-Verzeichnis, für welches (und dessen Unterverzeichnisse) die Beschränkung gelten soll.

Zugriff von außen sperren

Manches Private sollte eher privat bleiben.
Auf einem Webserver, auf den man auch vom Internet aus Zugriff hat, soll die eine oder andere Unterseite nur aus dem internen Netzwerk aufrufbar sein.
Die .htaccess-Datei dafür sieht in etwa so aus:

order deny,allow
deny from all
allow from 172.17.0.0/255.255.0.0

Hiermit haben nur Benutzer aus dem internen Netzwerk Zugriff, die eine 172.17.*.*er-IP-Adresse haben.

Erweiterte Schwierigkeiten durch Proxy

Dies hatte in der Firma einige Weile funktioniert, bis irgendwas an Proxy/Firewall umgestellt wurde.
Seitdem haben Zugriffe von außerhalb des Unternehmens-Netzwerkes eine IP, die so aussieht, als ob sie von innerhalb des Netzwerkes kommen würde (z.B. 172.17.60.10, was oben genannte Regel durchlässt).

Um herauszufinden, an Hand von was man Zugriffe von außerhalb und Zugriffe von innerhalb des Intranets unterscheiden kann, habe ich mir ausspucken lassen, was die $_SERVER-Variable in einem php-Testskript so alles beinhaltet, wenn man von außen zugreift. Gemeinsamer Nenner war HTTP_VIA, in welchem die IP 192.168.248.5 stand, wenn der Zugriff von außen erfolgte (und ansonsten leer war).
Somit konnte ich mein Problem nun mit einer RewriteRule in der .htaccess-Datei lösen.

Die vorherigen Einschränkungen habe ich weiterhin drinnen gelassen, zusätzlich verwende ich noch die RewriteEngine, um alle Anfragen, die mit einem HTTP_VIA mit IP-Adresse 192.168.248.5 rein kommen, auf http://www.apfel-z.net umzuleiten.

RewriteEngine On
order deny,allow
deny from all
allow from 172.17.0.0/255.255.0.0

RewriteCond %{HTTP:VIA} 192\.168\.248\.5
RewriteRule ^(.*)$ http://www.apfel-z.net [R=301,L]

Alternative könnte man statt umzuleiten als RewriteRule einen 403er-Status-Code ("Keine Berechtigung") senden:

RewriteRule ^(.*)$ - [R=403,L]

Zugriff nur mit Benutzername und Passwort (HTTP Simple Auth)

Ohne ein Login um seine Seite drumherum basteln zu müssen, kann man auch HTTP Simple Auth verwenden.
Werden in der .htaccess-Datei die richtigen Einträge gesetzt, erscheint eine Benutzername/Passwort-Abfrage, sobald man die Seite (oder Seiten in Unterverzeichnissen) öffnet.

AuthType Basic
AuthName "apfelz.intranet"
AuthUserFile /etc/apache2/passwords/apfelz_intranet
Require user apfeluser max.mustermann

Soll die Passwortabfrage nur erscheinen, wenn man von außerhalb des Netzwerkes zugreift, fügen wir noch ein paar Zeilen hinzu, damit IP-Adressbereichs (in diesem Beispiel 172.17.60.*) des internen Netzwerkes erlaubt sind.

AuthType Basic
AuthName "apfelz.intranet"
AuthUserFile /etc/apache2/passwords/apfelz_intranet
Require user apfeluser max.mustermann
Order allow,deny
Allow from 172.17.60
Satisfy any

Zugriff wird (bei Zugriff von außerhalb des lokalen Netzwerkes) nur für die Benutzer apfeluser und max.mustermann erlaubt.
Das jeweilige Passwort ist in diesem Beispiel in der Datei /etc/apache2/passwords/apfelz_intranet zu finden.

Nur Zugriff auf eine Datei/ein Verzeichnis sperren

Mit der oben beschriebenen Maßnahme wird der Zugriff auf das Verzeichnis, in welchem die .htaccess-Datei liegt und alle Unterverzeichnisse beschränkt.
Was aber, wenn ich nur den Zugriff auf eine bestimmte Datei oder ein bestimmtes Unterverzeichnis beschränken möchte?

Nehmen wir an, die .htaccess-Datei liegt im root-Verzeichnis und ich möchte den Zugriff auf das Unterverzeichnis test beschränken, aus irgendwelchen Gründen keine .htaccess-Datei direkt in jenes Unterverzeichnis legen (weil vielleicht auf Grund von modRewrite gar kein physisches Verzeichnis diesen Namens existiert).

Dann fügen wir der .htaccess-Datei Folgendes hinzu:

SetEnvIf Request_URI "^/test/*" test
Order deny,allow
AuthType Basic
AuthName "Test-Zugang nur mit Zugangsdaten"
AuthUserFile /etc/apache2/passwords/apfelz_intranet
Require user apfelzuser max.mustermann
Deny from env=test
Allow from env=!test
Satisfy any

Wie generiert man diese Passwort-Datei?

Bei Kommandozeilen-Zugriff auf den Webserver ist es am einfachsten, auf der Konsole folgenden Befhel einzugeben:

sudo htpasswd -c /etc/apache2/passwords/apfelz_intranet apfeluser

Hierbei wird die Datei /etc/apache2/passwords/apfelz_intranet erstellt, und ein Passwort für den Benutzer apfeluser angelegt. Das Passwort wird nach Eingabe des Befehls zweimal abgefragt.

Achtung: Für weitere Benutzer die Option -c weglassen. -c legt eine neue Datei an und schmeißt vorher erstellte Benutzer wieder raus. Also:

sudo htpasswd /etc/apache2/passwords/apfelz_intranet max.mustermann

Ohne Kommandozeilenzugriff:

Ich habe ein paar Seiten auf einem Strato-Webserver liegen, auf welchen ich weder Kommandozeilen-Zugriff habe, noch die Benutzer-Datei in einem Systemverzeichnis wie /etc/apache2/ ablegen kann.

Hier legt man die Passwortdatei am besten im selben Verzeichnis wie die .htaccess-Datei ab und muss erst einmal herausfinden, wie der absolute Pfad zu diesem Verzeichnis lautet.

Dazu habe ich eine Datei info.php mit dem Inhalt

<?php
print_r($_SERVER['DOCUMENT_ROOT']);
?>

erstellt und auf der obersten Ebene abgelegt. Diese ist nun (natürlich) über die Adresse http://meinwebserver.de/info.php aufrufbar und sollte den absoluten Pfad der php-Datei ausspucken. Zum Beispiel:

/home/strato/http/premium/rid/33/92/345748/htdocs

Die info.php kann nun wieder gelöscht werden.

Wir nennen die Datei mit Benutzern und ihren Passworten dises Mal .htuser und die .htaccess-Datei sollte nun wie folgt aussehen:

AuthType Basic
AuthName "apfelz.intranet"
AuthUserFile /home/strato/http/premium/rid/33/92/345748/htdocs/.htuser
Require user apfeluser max.mustermann

Im Internet finden sich genügend Seiten, mit deren Hilfe sich der Inhalt der .htuser-Datei generieren lässt, zum Beispiel htpasswdgenerator.de.
Einen Benutzernamen und Passwort eingeben, .htpasswd generieren, bzw bei weiteren Benutzern .htpasswd erweitern, am Ende die unten angezeigten Zeilen kopieren und als Datei .htuser in das oberste Verzeichnis des Webservers hochladen.
 

Voraussetzung: .htaccess-Dateien müssen interpretiert werden!

Standardmäßig werden die .htaccess-Dateien von Apache nicht interpretiert. Dazu muss in der Apache-Config-Datei noch eine kleine Änderung vorgenommen werden.

Config-Datei öffnen. Je nach System unter /etc/apache2/httpd.conf oder /etc/apache2/apache2.conf oder ähnlichem.

Irgendwo in der Datei müsste sich <Directory "/pfad/zu/webverzeichnis"> befinden und darunter eine Zeile AllowOverride None
Dies muss geändert wereden in AllowOverride All und danach den Apache neu starten.

Beispiel unter MacOS X:

<Directory "/Library/WebServer/Documents">
    Options FollowSymLinks Multiviews
    MultiviewsMatch Any
    AllowOverride All
    Require all granted
</Directory>