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.

Denis Rendler
źródło
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)

ansi_lumen
źródło
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!

LinzTM
źródło
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
2

W przypadku Apache 2.4 możesz użyć <RequireAny>. Możesz to zrobić w pliku vhost lub pliku .htaccess ....

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>

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

MontyThreeCard
źródło