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.

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.