Denegar todo, permitir solo una IP a través de htaccess

156

Estoy tratando de negar todo y permitir solo una sola IP. Pero, me gustaría tener el siguiente htaccess funcionando para esa única IP. No estoy encontrando una manera de hacer que ambos funcionen: negar todo y permitir solo uno, más las siguientes opciones:

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

¿Hay alguna manera de hacer que esto funcione?

punkbit
fuente

Respuestas:

356
order deny,allow
deny from all
allow from <your ip> 
b101101011011011
fuente
95
¡NOTA! Apache es sensible para espacios en htaccess. No permita ningún espacio entre negar, permitir. Es decir, no escribir orden negar, permitir.
H.Rabiee
2
INFORMACIÓN: ¡también funciona para IPv6! sólo tiene que añadir otra línea conallow from yourIPv6
jave.web
¿Es posible en nginx?
shgnInc
10
Nota sobre los documentos 2.4 : las directivas Permitir, Denegar y Ordenar, proporcionadas por mod_access_compat, están en desuso y desaparecerán en una versión futura. Debe evitar usarlos y evitar tutoriales obsoletos que recomiendan su uso.
Martin Schneider
44
Como señaló @ MA-Maddin, - entonces mod_access_compat están en desuso. Esta publicación muestra cómo hacerlo en versiones más recientes. Y también se debe considerar, si el servidor está usando un proxy, ya que eso mostrará la IP del proxy para el visitante. Esta publicación sugiere una solución para eso.
Zeth
115

Sé que esta pregunta ya tiene una respuesta aceptada, pero la documentación de Apache dice:

Las directivas Permitir, Denegar y Ordenar, proporcionadas por mod_access_compat, están en desuso y desaparecerán en una versión futura. Debe evitar usarlos y evitar tutoriales obsoletos que recomiendan su uso.

Entonces, una respuesta más a prueba de futuro sería:

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

Con suerte, he ayudado a evitar que esta página se convierta en uno de esos "tutoriales obsoletos". :)

Rok Sprogar
fuente
¿Dónde ponemos nuestra IP?
Gary Carlyle Cook
1
¡Camino a seguir! Esta debería ser una solución aceptada, ya que no solo funciona, sino que también es resistente al tiempo.
6opko
La otra respuesta no ayudó en mi situación. Pero este sí. Gracias por actualizar un hilo viejo.
Johann Dyck
1
¿El ejemplo de esta respuesta permite el acceso desde dos IP? Entonces, para agregar varias IP, ¿solo ponemos un espacio entre ellas? ¿Puede poner Require ipvarias líneas para que sea más legible para el usuario o todas las IP deben estar en una sola línea?
Hastig Zusammenstellen
si usó esto, ¿cómo redirigiría a una nueva página temporal como hicieron algunas de las respuestas?
Rudtek
39

Esto se puede mejorar utilizando la directiva diseñada para esa tarea.

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

Donde 111.222.333.444 es su dirección IP estática.

Cuando se utiliza la directiva "Permitir pedido, denegar", las solicitudes deben coincidir con Permitir o Denegar, si no se cumple ninguno, la solicitud se rechaza.

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

MickeyRoush
fuente
1
¿Cómo agregar un uRL personalizado?
segundos
32

Versión ligeramente modificada de lo anterior, que incluye una página personalizada para mostrar a aquellos a quienes se les niega el acceso:

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

... y de esa manera aquellas solicitudes que no provengan de 111.222.333.444 verán specific_page.html

(publicar esto como comentario parecía terrible porque se pierden nuevas líneas)

Oliver Maksimovic
fuente
Hola. Tengo exactamente el mismo código que usted tiene en mi .htaccess pero sigo recibiendo un error 500. La página que especifiqué se llama test.htmly está en la misma carpeta que .htaccess. Sin embargo, no puedo ver los registros (no permitido desde el servidor). ¿Tienes alguna idea de por qué podría tener ese problema? Cuando obtengo la ruta del archivo a través de un cliente ftp, me dice que /test.htmlla ruta no debería ser un problema, ¿verdad?
Musterknabe
Además, el error 500 aparece incluso cuando tengo la línea con el documento de error comentado. Entonces ese no debería ser el problema. ¿Hay alguna razón por la que las otras 3 líneas no podrían funcionar? En mi .htaccess tengo tres líneas más, donde redirijo no www a www, pero eso es todo. Pero también recibo el error cuando SOLO tengo las tres líneas con negar, permitir, etc.
Musterknabe
¿Cómo agregar una URL personalizada?
segundos
8

Mejorando un poco más las respuestas anteriores, se puede mostrar una página de mantenimiento a sus usuarios mientras realiza cambios en el sitio:

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

Dónde:

IvanRF
fuente
Cuando uso el ErrorDocument 403 obtengo un error 403 adicional para ese archivo maintenance.html, porque tampoco puede acceder a ese archivo. ¿Tienes una solución para eso?
Zdravko Donev
3

Además de la respuesta de @David Brown, si desea bloquear una IP, primero debe permitir todo y luego bloquear las IP como tales:

    <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

Puede usar cualquiera de las anotaciones mencionadas anteriormente para satisfacer sus necesidades de CIDR.

Rafa Carvalhido
fuente
¡Gracias, esta es la forma correcta de lidiar con Apache 2.4!
Aleksandar Pavić
2

Puede usar lo siguiente en htaccess para permitir y denegar el acceso a su sitio:

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

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

Primero configuramos una variable env allowip si la dirección IP del cliente coincide con el patrón, si el patrón coincide, entonces a la variable env allowip se le asigna el valor 1 .

En el siguiente paso, usamos las directivas Permitir, denegar para permitir y denegar el acceso al sitio. Order deny,allowrepresenta el orden de denyy allow. deny from allesta línea le dice al servidor que niegue a todos. la última línea allow from env=allowedippermite el acceso a una única dirección IP para la que establecemos la variable env.

Reemplace 1\.2\.3\.4\.5con su dirección IP permitida.

Referencias

Amit Verma
fuente
1
¿Cuáles son las ventajas de usar esto en lugar de solo Permitir desde 324.234.22.1?
Berry M.
2

No pude usar el método 403 porque quería la página de mantenimiento y las imágenes de página en una subcarpeta en mi servidor, así que utilicé el siguiente enfoque para redirigir a una 'página de mantenimiento' para todos menos una sola IP *

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

Fuente: Crear una página de espera para ocultar tu blog de WordPress

METALFURIO
fuente
Esta solución es la más simple. Lo prefiero
Gerfried
1

Puede tener más de una IP o incluso algún otro tipo de permiso como usuario, nombre de host, ... más información aquí 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
fuente
0

Si desea usar mod_rewrite para el control de acceso, puede usar condiciones como agente de usuario, referencia http, dirección remota, etc.

Ejemplo

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

Referencias

Abhishek Gurjar
fuente
0

Agregue el siguiente comando en el archivo .htaccess. Y coloque ese archivo en su carpeta htdocs.

Order Deny,Allow
Deny from all
Allow from <your ip> 
Allow from <another ip> 
Ramsha Omer
fuente
0
ErrorDocument 403 /maintenance.html
Order Allow,Deny
Allow from #:#:#:#:#:#

Para mí, esto parece funcionar (Usar IPv6 en lugar de IPv4) No sé si esto es diferente para algunos sitios web, pero para el mío funciona.

TigerMANEK426
fuente