Apache 2.4 beschränkt die URL auf bestimmte IPs

13

Ich versuche, eine bestimmte URL so einzuschränken, dass sie außerhalb des Netzwerks nur für bestimmte IP-Adressen verfügbar ist. Wenn ein Benutzer außerhalb versucht, auf diese URL zuzugreifen, und nicht über die IP-Liste, sollte er auf die Homepage umgeleitet werden.

Dies ist, was ich bisher ohne Glück versucht habe. Der letzte Teil leitet jeden zur Homepage weiter, unabhängig von der IP-Adresse.

<Location "/secret">
#    <If "%{REMOTE_ADDR} != -ipmatch '123.123.123.123/255.255.255.255'">
#    Redirect 303 "/secret" /
#    </If>

RewriteCond "%{REMOTE_ADDR}" "!123\.123\.123\.123"
RewriteRule .* / [R,L]

LogLevel debug rewrite:trace6
</Location>

PS: Die / secret-URL ist tatsächlich eine virtuelle URL und existiert physisch nicht auf dem Laufwerk.

Denis Rendler
quelle
Die If-Anweisungen sind auskommentiert? Umschreiben aktivieren - RewriteEngine On?
user9517
Die <If> -Anweisung ist eine Version, die ich ausprobiert habe. Die RewriteEngine On-Direktive wurde früher deklariert. Das ist der Grund, warum es alle umleitet
Denis Rendler
1
Ich denke, Sie sollten die Markierung der ausgewählten Antwort
aufheben

Antworten:

3

Verwenden Sie Order, Denyund allowfestlegen , wer Zugriff auf Ihre vHost oder Lage.

<VirtualHost *:80>
    ServerName example.net
    DocumentRoot /docroot

    <Directory "/docroot">
        Order Deny,Allow
        Deny from all
        Allow from 10.10.10.10
        Allow from 10.10.11.0/24
    </Directory>   
</VirtualHost>

Denken Sie beim Umleiten an eine benutzerdefinierte Fehlerseite . Dies ist viel allgemeiner, da jeder nicht autorisierte Zugriff einen 403-Fehler hervorrufen sollte und somit leicht ausgewertet werden kann.

Ich habe das nie mit Apache gemacht, sondern diese Strategie mit Nginx. Für Apache sollte so etwas tun:

ErrorDocument 403 http://homepage.example.com

Benutzerdefinierte Fehlerdokumente werden mit der ErrorDocument-Direktive konfiguriert, die im globalen, virtuellen oder Verzeichniskontext verwendet werden kann. Es kann in .htaccess-Dateien verwendet werden, wenn AllowOverride auf FileInfo gesetzt ist. (aus den Apache-Dokumenten)

ansi_lumen
quelle
2
Dies sieht aus wie eine Reihe von Apache httpd 2.2-Konfiguration. Wird es mit 2.4 noch funktionieren?
user9517
Zumindest der ErrorDocumentTeil stammt aus den 2.4-Dokumenten. Ich glaube nicht , Apache zu verwenden, da nginx um ist, aber angenommen , dass Order, Denyund Allowsind immer noch rund in Apache 2.4
ansi_lumen
Danke, aber ich helfe nicht. Ich habe vergessen zu erwähnen, aber ich habe die Frage aktualisiert, dass die / secret URL tatsächlich eine virtuelle URL ist und physisch nicht auf dem Laufwerk vorhanden ist. Die URL selbst ist eine Umschreibung von index.php, deshalb habe ich die Direktive <Location> verwendet.
Denis Rendler
4
Diese Syntax ist in Apache 2.4 veraltet
Luca Reghellin
1
Warum ist das die akzeptierte Antwort? Dies ist für Apache 2.2 nicht 2.4, wie die Frage impliziert ... Dies wird nicht funktionieren.
Jeremy
22

Die Optionen Order, Deny und Allow wurden in Apache 2.4 durch ersetzt

<Directory /var/www/mysite.com/htdocs/public>
    Require all granted
</Directory>

Sie können Adressen explizit einschränken, indem Sie Folgendes verwenden:

<Directory /var/www/mysite.com/htdocs/public>
    Require all granted
    Require not ip 192.168.0.1
</Directory>

Das genaue Gegenteil ist der Fall, um alle einzuschränken und nur eine Teilmenge zuzulassen, verwenden Sie Folgendes:

<Directory /var/www/mysite.com/htdocs/public>
    Require host example.com
    Require ip 192.168.0.1
</Directory>

Weitere Informationen finden Sie in der Dokumentation zur Apache 2.4-Zugriffssteuerung.

In Bezug auf Ihre Frage (die ich aufgrund fehlender Punkte zum Hinzufügen eines Kommentars selbst bearbeitet habe) sollten Sie in der Lage sein, einfach ein ErrorDocument mit dem Index als URL-Pfad festzulegen:

<Directory /var/www/mysite.com/htdocs/public>
    Require host example.com
    Require ip 192.168.0.1
    ErrorDocument 401 /index.html
</Directory>

Hoffe das hilft!

Linztm
quelle
Danke, @Linztm! Das löst aber nur teilweise mein Problem. Ich möchte den Benutzer nicht nur sperren, sondern auch zur Startseite weiterleiten.
Denis Rendler
Es scheint nur mit der ErrorDocument-Direktive zu funktionieren, wenn ich die vollständige URL einschließlich Domäne und Protokoll angebe. Ich werde weiter forschen. Vielen Dank.
Denis Rendler
Ich habe mindestens einen Fall gefunden, in dem Sie, allowobwohl veraltet, Require 127.0.0.1 den Zugriff über eine externe Adresse von einem lokalen Computer aus zulassen müssen, wobei als Erlaubnissyntax nur Adressen von 127 zugelassen werden.
Alexei Martianov
2

Für Apache 2.4 können Sie <RequireAny> verwenden. Sie können dies in einer vhost- oder einer .htaccess-Datei tun.

SetEnvIF IP xxx.xxx.xxx.xxx AllowThisIP  # Or X-Real-IP
SetEnvIF IP yyy.yyy.yyy.yyy AllowThisIP
<RequireAny>
  Require env AllowThisIP
  Require host example.com
</RequireAny>

Apache-Dokumente https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#requireany

MontyThreeCard
quelle