Odmów wszystkim, zezwalaj tylko na jeden adres IP przez htaccess

156

Próbuję odmówić wszystkim i zezwolić tylko na jeden adres IP. Ale chciałbym, aby następujący htaccess działał dla tego pojedynczego adresu IP. Nie znajduję sposobu, aby oba działały: odmów wszystkich i zezwalaj tylko na jedną, a także następujące opcje:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    #Removes access to the system folder by users.
    #Additionally this will allow you to create a System.php controller,
    #previously this would not have been possible.
    #'system' can be replaced if you have renamed your system folder.
    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #When your application folder isn't in the system folder
    #This snippet prevents user access to the application folder
    #Submitted by: Fabdrol
    #Rename 'application' to your applications folder name.
    RewriteCond %{REQUEST_URI} ^application.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #Checks to see if the user is attempting to access a valid file,
    #such as an image or css document, if this isn't true it sends the
    #request to index.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

<IfModule !mod_rewrite.c>
    # If we don't have mod_rewrite installed, all 404's
    # can be sent to index.php, and everything works as normal.
    # Submitted by: ElliotHaughin

    ErrorDocument 404 /index.php
</IfModule>

Czy jest sposób, aby to zadziałało?

punkbit
źródło

Odpowiedzi:

356
order deny,allow
deny from all
allow from <your ip> 
b101101011011011
źródło
95
UWAGA! Apache jest wrażliwy na spacje w htaccess. Nie zezwalaj na odstępy między zaprzecz, zezwalaj. To znaczy nie pisz rozkazu odmów, pozwól.
H.Rabiee,
2
INFO: - działa również dla IPv6! po prostu dodaj kolejną linię zallow from yourIPv6
jave.web
Czy to możliwe w Nginx?
shgnInc
10
Uwaga do dokumentów 2.4 : Dyrektywy Allow, Deny i Order, dostarczane przez mod_access_compat, są przestarzałe i znikną w przyszłej wersji. Powinieneś unikać ich używania i unikać przestarzałych samouczków zalecających ich użycie.
Martin Schneider
4
Jak zauważył @ MA-Maddin, - wtedy mod_access_compat są przestarzałe. Ten post pokazuje, jak to zrobić w nowszych wersjach. Należy również rozważyć, czy serwer używa proxy, ponieważ wtedy wyświetlałby on adres IP proxy dla odwiedzającego. Ten post sugeruje rozwiązanie tego problemu.
Zeth
115

Wiem, że to pytanie ma już zaakceptowaną odpowiedź, ale dokumentacja Apache mówi:

Dyrektywy Allow, Deny i Order, dostarczane przez mod_access_compat, są przestarzałe i znikną w przyszłej wersji. Powinieneś unikać ich używania i unikać przestarzałych samouczków zalecających ich użycie.

Tak więc bardziej przyszłościowa odpowiedź brzmiałaby:

<RequireAll>
    Require ip xx.xx.xx.xx yy.yy.yy.yy
</RequireAll>

Mam nadzieję, że pomogłem zapobiec temu, by ta strona stała się jednym z tych „przestarzałych samouczków”. :)

Rok Sprogar
źródło
Gdzie umieszczamy nasze IP?
Gary Carlyle Cook
1
Tak trzymać! To powinno zostać zaakceptowane rozwiązanie, ponieważ jest nie tylko działające, ale także odporne na czas.
6opko
Druga odpowiedź nie pomogła w mojej sytuacji. Ale ten zrobił. Dzięki za aktualizację starego wątku.
Johann Dyck,
1
Przykład tej odpowiedzi umożliwia dostęp z dwóch adresów IP? Tak więc, aby dodać wiele adresów IP, po prostu wstawiamy spację między nimi? Czy możesz umieścić Require ipw wielu wierszach, aby były bardziej czytelne dla użytkownika, czy też wszystkie adresy IP muszą znajdować się w jednym wierszu?
Hastig Zusammenstellen
gdybyś z tego skorzystał, w jaki sposób przekierowałbyś do nowej strony tymczasowej, tak jak w przypadku niektórych odpowiedzi?
rudtek
39

Można to poprawić, używając dyrektywy zaprojektowanej do tego zadania.

ErrorDocument 403 /specific_page.html
Order Allow,Deny
Allow from 111.222.333.444

Gdzie 111.222.333.444 to Twój statyczny adres IP.

W przypadku korzystania z dyrektywy „Order Allow, Deny” żądania muszą być zgodne z wartością Allow lub Deny. Jeśli żadna z nich nie jest spełniona, żądanie jest odrzucane.

http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html#order

MickeyRoush
źródło
1
jak dodać niestandardowy URL?
Secondight
32

Nieznacznie zmodyfikowana wersja powyższego, w tym niestandardowa strona do wyświetlenia osobom, którym odmówiono dostępu:

ErrorDocument 403 /specific_page.html
order deny,allow
deny from all
allow from 111.222.333.444

... i w ten sposób żądania, które nie pochodzą z adresu 111.222.333.444, zostaną wyświetlone pod adresem specific_page.html

(opublikowanie tego jako komentarza wyglądało okropnie, ponieważ nowe linie się zgubiły)

Oliver Maksimovic
źródło
Cześć. Mam dokładnie ten sam kod, co w moim .htaccess, ale ciągle otrzymuję błąd 500. Podana przeze mnie strona nazywa się test.htmli znajduje się w tym samym folderze co plik .htaccess. Jednak nie widzę logów (niedozwolone z serwera). Czy masz pojęcie, dlaczego mogę mieć ten problem? Kiedy otrzymuję ścieżkę do pliku przez klienta ftp, mówi mi /test.html, że ścieżka nie powinna stanowić problemu, prawda?
Musterknabe
Ponadto błąd 500 pojawia się nawet wtedy, gdy mam zakomentowaną linię z dokumentem błędu. Więc to nie powinno być problemem. Czy jest jakiś powód, dla którego pozostałe 3 linie nie mogą działać? W moim .htaccess mam jeszcze trzy linie, w których przekierowuję inne niż www na www, ale to wszystko. Ale pojawia się również błąd, gdy mam TYLKO trzy linie z odmową, zezwoleniem itp.
Musterknabe
Jak dodać niestandardowy adres URL?
Secondight
8

Ulepszając nieco poprzednie odpowiedzi, można wyświetlać użytkownikom stronę konserwacji podczas wprowadzania zmian w witrynie:

ErrorDocument 403 /maintenance.html
Order Allow,Deny
Allow from #.#.#.#

Gdzie:

IvanRF
źródło
Kiedy używam ErrorDocument 403, otrzymuję dodatkowy błąd 403 dla tego pliku Maintenance.html, ponieważ nie ma on również dostępu do tego pliku. Czy masz na to rozwiązanie?
Zdravko Donev
3

Oprócz odpowiedzi @Davida Browna, jeśli chcesz zablokować adres IP, musisz najpierw zezwolić na wszystko, a następnie zablokować adresy IP jako takie:

    <RequireAll>
      Require all granted
      Require not ip 10.0.0.0/255.0.0.0
      Require not ip 172.16.0.0/12
      Require not ip 192.168
    </RequireAll>

First line allows all
Second line blocks from 10.0.0.0 to 10.255.255.255
Third line blocks from 172.16.0.0 to 172.31.255.255
Fourth line blocks from 192.168.0.0 to 192.168.255.255

Możesz użyć dowolnej z wyżej wymienionych notacji, aby dopasować ją do potrzeb CIDR.

Rafa Carvalhido
źródło
Dzięki, to właściwy sposób radzenia sobie z Apache 2.4!
Aleksandar Pavić
2

W htaccess możesz użyć następujących opcji, aby zezwolić lub odmówić dostępu do swojej witryny:

SetEnvIf remote_addr ^1\.2\3\.4\.5$ allowedip=1

Order deny,allow
deny from all
allow from env=allowedip

Najpierw ustawiamy zmienną env allowedip, jeśli adres IP klienta jest zgodny ze wzorcem, jeśli wzorzec jest zgodny, zmienna env allowedip ma wartość 1 .

W następnym kroku używamy dyrektyw Allow, Deny, aby zezwolić i odmówić dostępu do witryny. Order deny,allowreprezentuje kolejność denyi allow. deny from allta linia mówi serwerowi, aby odmawiał wszystkim. ostatnia linia allow from env=allowedipumożliwia dostęp do pojedynczego adresu IP, dla którego ustawiliśmy zmienną env.

Zastąp 1\.2\.3\.4\.5dozwolonym adresem IP.

Źródła:

Amit Verma
źródło
1
Jakie są zalety korzystania z tego zamiast po prostu Zezwól od 324.234.22.1?
Berry M.,
2

Nie mogłem użyć metody 403, ponieważ chciałem, aby strona konserwacyjna i obrazy stron znajdowały się w podfolderze na moim serwerze, więc zastosowałem następujące podejście, aby przekierować na stronę konserwacji dla wszystkich oprócz jednego adresu IP *

RewriteEngine on
RewriteCond %{REMOTE_ADDR} !**.**.**.*
RewriteRule !^maintenance/ http://www.website.co.uk/maintenance/ [R=302,L]

Źródło: utworzenie strony rezerwującej, aby ukryć swój blog WordPress

METALFURY
źródło
To rozwiązanie jest najprostsze - wolę to
Gerfried
1

Możesz mieć więcej niż jeden adres IP lub nawet innego rodzaju zezwolenie, takie jak użytkownik, nazwa hosta, ... więcej informacji tutaj https://www.askapache.com/htaccess/setenvif/

SetEnvIf remote_addr ^123.123.123.1$ allowedip=1
SetEnvIf remote_addr ^123.123.123.2$ allowedip=1
SetEnvIf remote_addr ^123.123.123.3$ allowedip=1
SetEnvIf remote_addr ^123.123.123.4$ allowedip=1

Order deny,allow
deny from all
allow from env=allowedip
Meloman
źródło
0

Jeśli chcesz używać mod_rewrite do kontroli dostępu, możesz użyć warunków, takich jak agent użytkownika, strona odsyłająca http, adres zdalny itp.

Przykład

RewriteCond %{REMOTE_ADDR} !=*.*.*.* #you ip address
RewriteRule ^$ - [F]

Źródła:

Abhishek Gurjar
źródło
0

Dodaj następujące polecenie w pliku .htaccess. I umieść ten plik w folderze htdocs.

Order Deny,Allow
Deny from all
Allow from <your ip> 
Allow from <another ip> 
Ramsha Omer
źródło
0
ErrorDocument 403 /maintenance.html
Order Allow,Deny
Allow from #:#:#:#:#:#

Wydaje mi się, że to działa (przy użyciu protokołu IPv6 zamiast IPv4). Nie wiem, czy w przypadku niektórych witryn jest inaczej, ale w przypadku moich to działa.

TigerMANEK426
źródło