Apache 2.4 ogranicza adres URL do niektórych adresów IP


14

Próbuję ograniczyć konkretny adres URL, aby był dostępny poza siecią tylko do określonych adresów IP. Gdy użytkownik na zewnątrz próbuje uzyskać dostęp do tego adresu URL, a nie z listy adresów IP, powinien zostać przekierowany na stronę główną.

Właśnie tego próbowałem dotychczas bez powodzenia. Ostatnia część przekierowuje wszystkich na stronę główną bez względu na adres IP.

<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: / tajny adres URL jest w rzeczywistości wirtualnym adresem URL i nie istnieje fizycznie na dysku.


Jeśli komentarze są komentowane? Włączyć przepisywanie - RewriteEngine On?
user9517

Instrukcja <If> to jedna wersja, którą wypróbowałem. Dyrektywa RewriteEngine On została zadeklarowana wcześniej. Dlatego przekierowuje wszystkich
Denis Rendler,

1
Myślę, że powinieneś odznaczyć wybraną odpowiedź, ponieważ jest ona nieprawidłowa dla Apache 2.4 zgodnie z twoją prośbą (daje złe informacje dla przechodzących ludzi)
Erenor Paz

Odpowiedzi:


4

Używać Order, Denyi allowokreślić, kto ma dostęp do swojego vhost lub lokalizacji.

<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>

Jeśli chodzi o przekierowanie, pomyśl o niestandardowej stronie błędu . Jest to o wiele bardziej ogólne, ponieważ każdy nieautoryzowany dostęp powinien powodować błąd 403 i dlatego może być łatwo oceniony.

Nigdy nie robiłem tego z Apache, ale używam tej strategii z Nginx. W przypadku apache coś takiego powinno zrobić:

ErrorDocument 403 http://homepage.example.com

Niestandardowe dokumenty błędów są konfigurowane za pomocą dyrektywy ErrorDocument, która może być używana w kontekście globalnym, wirtualnym hoście lub katalogu. Może być stosowany w plikach .htaccess, jeśli AllowOverride jest ustawiony na FileInfo. (z dokumentów apache)


2
Wygląda to na zestaw konfiguracji Apache httpd 2.2. Czy nadal będzie działać z wersją 2.4?
user9517

Przynajmniej ErrorDocumentczęść pochodzi z dokumentów 2.4. Nie używam apache, nginx, ponieważ jest dookoła, ale zakłada się, że Order, Denyi Allownadal są wokół w apache 2.4
ansi_lumen

Dzięki, ale nie pomagam. Zapomniałem wspomnieć, ale zaktualizowałem pytanie, adres URL / secret jest w rzeczywistości wirtualnym adresem URL i fizycznie nie istnieje na dysku. Sam adres URL jest przepisem z index.php, dlatego użyłem dyrektywy <Lokalizacja>.
Denis Rendler,

4
Ta składnia jest przestarzała w Apache 2.4
Luca Reghellin,

1
Dlaczego jest to akceptowana odpowiedź? To dotyczy Apache 2.2, a nie 2.4, jak sugeruje to pytanie ... To nie zadziała.
Jeremy

23

Opcje Kolejności, Odmów i Zezwól zostały zastąpione w Apache 2.4 przez

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

Możesz jawnie ograniczyć adresy, używając następujących elementów:

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

Jest też dokładnie odwrotne, aby ograniczyć wszystko i pozwolić tylko podzestawowi użyć następujących elementów:

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

Więcej informacji jest dostępnych w dokumentacji kontroli dostępu Apache 2.4.

W odniesieniu do twojego pytania (edytowanego przeze mnie z powodu braku punktów do dodania komentarza) powinieneś być w stanie po prostu ustawić ErrorDocument z indeksem ustawionym jako ścieżka URL:

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

Mam nadzieję że to pomoże!


Dzięki, @Linztm! Ale to tylko częściowo rozwiązuje mój problem. Nie chcę tylko blokować użytkownika, ale także przekierowywać go na stronę główną.
Denis Rendler,

Wydaje się, że działa z dyrektywą ErrorDocument tylko wtedy, gdy podam pełny adres URL, w tym domenę i protokół. Będę dalej badać. Dzięki.
Denis Rendler

Znalazłem co najmniej jeden przypadek, gdy musisz użyć, allowchoć przestarzałe, Require 127.0.0.1 nadal zezwalaj na dostęp przez zewnętrzny adres z komputera lokalnego, gdzie jako zezwól na składnię zezwól tylko z adresu 127.
Aleksiej Martianow

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.