Art. para Webmasters y Joomla!


Logo de Net & Software (N&S)

Net And Software

Creación y Diseño de Páginas Web

Soporte, Desarrollo y Soluciones Joomla!®

Nivel de comprensión muy difícil

Índice

  1. Introducción al .htaccess
  2. Bloqueando y permitiendo acceso
  3. Re-escritura y Redirección
  4. Compresión y caché
  5. Otras funcionalidades del .htaccess
  6. Recomendaciones sobre el fichero .htaccess
  7. Simbología del fichero .htaccess

 

1.- Introducción

Hay muchísimos artículos en la red sobre el fichero .htaccess, así que es una buena forma de agrupar y reunir lo que realmente es interesante sobre este tema, mediante ejemplos claros que sirvan como ejemplo.

Primero, tenemos que decir que el fichero .htaccess es una verdadera 'navaja suiza' para el control del acceso a tu sitio web. Con ella se puede redireccionar a una persona, denegar el acceso, comprimir los ficheros, establecer una caché para los archivos, etc.

.htaccess significa acceso de hipertexto -hipertext access- y es un archivo de configuración de Apache. Apache es el software encargado de servir páginas web para plataformas Unix, Microsoft Windows, Mac, etc.

 

Advertencia: un error en el .htaccess puede hacer que no se vea la web hasta que se arregle dicho error.

 

Es evidente, pero importante, saber que en todos los ejemplos habrá que sustituir los nombres genéricos y las IP por las correctas en tu servidor. En muchos casos los dominios son del tipo dominio.com, ejemplo1.com, ejemplo2.com y similares, y las IP suelen ser 100.100.100.100, 100.101.102.103, y parecidas.

 

 

2.- Bloqueando y Permitiendo Acceso

 

Denegar el acceso a un directorio -carpeta- del servidor

Crear un fichero .htaccess dentro de la carpeta con las instrucciones:

#denegar todo acceso
deny from all

 

Permitir el acceso sólo a una IP

#denegar todo acceso excepto una IP
deny from all
allow from 100.100.100.100

 

Permitir el acceso sólo a un rango específico de IPs (forzado mediante la máscara de red)

#denegar todo acceso excepto a un rango de IP
deny from all
allow from 100.100.100.100/24

 

Bloquear el acceso a un archivo específico

#bloquear un fichero concreto
<Files archivo_a_bloquear.html>
order allow,deny
deny from all

 

Redireccionar visitantes a una dirección alternativa, menos a una IP específica

#Redireccionar a todos a otrositio.com excepto una IP concreta
ErrorDocument 403 http://www.otrositio.com
order deny,allow
deny from all
allow from 100.101.102.103

 

Denegar un rango completo de IP

Esto quiere decir que elimina 256 direcciones en el primer caso, 65536 en el segundo caso, y más de 16 millones de direcciones IP en el tercer caso

# Primer caso: deniega el acceso a 256 IPs, desde la 100.100.100.0 hasta la 100.100.100.255
order allow,deny
deny from 100.100.100.

 

# Segundo caso: deniega 65536 IP
order allow,deny
deny from 100.100.

 

# Tercer caso: deniega todas las IP que empiezan por 100, que son más de 16 millones
order allow,deny
deny from 100.

 

Permitir un rango concreto de IP a la web

# permitir acceso a rango 100.100.100.0 hasta 100.100.100.255
order deny,allow
allow from 100.100.100.

 

Denegar acceso de un dominio concreto

# bloquear acceso a un dominio
order allow,deny
allow from all
deny from .*dominio\.com.*

 

Denegar acceso a visitantes que vengan de un dominio concreto

# bloquear acceso visitas desde ejemplo1.com y ejemplo2.com
RewriteCond %{HTTP_REFERER} ejemplo1\.com [NC,OR]
RewriteCond %{HTTP_REFERER} ejemplo2\.com [NC,OR]
RewriteRule .* - [F]

 

Denegar acceso a una hora específica

# bloquear acceso una hora
RewriteCond %{TIME_HOUR} ^12$
RewriteRule ^.*$ - [F,L]

 

Denegar acceso a un directorio a varias horas concretas

# bloquear acceso en varias horas
RewriteCond %{TIME_HOUR} ^(12|13|14|15)$
RewriteRule ^.*$ - [F,L]

 

Denegar acceso a muchos proxies

# bloqueo de Proxies
RewriteCond %{HTTP:VIA} !^$ [OR]
RewriteCond %{HTTP:FORWARDED} !^$ [OR]
RewriteCond %{HTTP:USERAGENT_VIA} !^$ [OR]
RewriteCond %{HTTP:X_FORWARDED_FOR} !^$ [OR]
RewriteCond %{HTTP:PROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:XPROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:HTTP_PC_REMOTE_ADDR} !^$ [OR]
RewriteCond %{HTTP:HTTP_CLIENT_IP} !^$
RewriteRule ^(.*)$ - [F]

 

Prevenir accesos al archivo .htaccess

# prevenir acceso .htaccess
<files .htaccess>
order allow,deny
deny from all
</files>

 

Prevenir el acceso a un archivo específico

#prevenir acceso a un fichero concreto
<files nombre.jpg>
order allow,deny
deny from all
</files>

 

Prevenir el acceso a varios tipos de archivos

# prevenir acceso a tipos de ficheros concretos
<FilesMatch "\.(htaccess|htpasswd|ini|phps|log)$">
order allow,deny
deny from all
</FilesMatch>

 

Evitar que se muestren determinados tipos de ficheros

# evitar muestra de fichero MP4, WMV y AVI
IndexIgnore *.wmv *.mp4 *.avi

 

Evitar el listado de directorios

# evitar listado de directorios
IndexIgnore *

 

Evitar el hotlinking en el dominio

El hotlinking es cuando descargan ficheros de tu servidor desde otra web para mostrarlos en ésta, 'robando' ancho de banda y servicios del tuyo.

# Evita el hotlinking a ficheros GIF y JPG del servidor
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?midominio\.com/.*$ [NC]
RewriteRule .*\.(gif|jpg)$ http://www.midominio.com/hotlinking.jpg [R,NC,L]

 

Nota: Es más eficaz, si el archivo que mostramos a aquellos que realizan el hotlinking lo colgamos en un servidor gratuito de imágenes tipo ImageShack.us (o similares) y lo referenciamos allí.

 

Bloqueo de ficheros determinados el cualquier subdominio, para evitar hotlinking específico

Para evitar el hotlinking a ficheros MP3 y ficheros de vídeo AVI, WMV y MPG:

# Evita el hotlinking a ficheros MP3, AVI, WMV y MPG de cualquier subdominio y dominio del servidor
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://([-a-z0-9]+\.)?midominio\.com [NC]
RewriteRule .*\.(mp3|avi|wmv|mpg|mpeg)$ http://www.midominio.com/images/nohotlink.gif [R,NC,L]

 

Nota: si se envían ficheros por RSS -sindicación del sitio- debe tenerse en cuenta, ya que las instrucciones anteriores bloquean todo el contenido de vídeo y los RSS pueden verse mal.

 

Nota: Es más eficaz, si el archivo que mostramos a aquellos que realizan el hotlinking lo colgamos en un servidor gratuito de imágenes tipo ImageShack.us o similar, y lo referenciamos allí.

 

Bloqueo de robot -bot- específico, a través de SetEnvIfNoCase

# bloqueo del bot BotMalo
SetEnvIfNoCase User-Agent "BotMalo/" spambot
deny from env=spambot

 

Bloque de robot -bot- específico, a través de Rewrite

# bloqueo de 3 bots conocidos (hay muchísimos más)
RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus
RewriteRule .* - [F]

 

Bloqueo de robot -bot- que accede siempre al mismo fichero

# bloqueo del bot al acceder a un fichero PHP concreto
SetEnvIfNoCase Request_URI "/firefoxz.php$" spambot
deny from env=spambot

 

Bloqueo de robot -bot- que siempre es referenciado desde un mismo sitio, a través de SetEnvIfNoCase

# bloqueo cuando se viene referenciado de un sitio web concreto
SetEnvIfNoCase Referer "^http://www.dominiospammers.com/" spambot
deny from env=spambot

 

Nota: Las 3 anteriores sentencias pueden combinarse escribiendo las 3 líneas SetEnvIfNoCase, y luego solo un deny, de la siguiente forma:

SetEnvIfNoCase User-Agent "BotMalo/" spambot
SetEnvIfNoCase Request_URI "/firefoxz.php$" spambot
SetEnvIfNoCase Referer "^http://www.spammers.com/" spambot
deny from env=spambot

 

Bloqueo de robot -bot- que siempre es referenciado desde un mismo sitio, a través de Rewrite

# bloqueo cuando se viene referenciado de un sitio web concreto ejemplo1.com
RewriteCond %{HTTP_REFERER} ^ejemplo1\.com$ [NC]
RewriteRule .* - [F]

 

Bloqueo de robot -bot- que siempre es referenciado desde dos sitios, a través de Rewrite

# bloqueo cuando se viene referenciado desde ejemplo1.com o ejemplo2.com
RewriteCond %{HTTP_REFERER} ^ejemplo1\.com$ [NC,OR]
RewriteCond %{HTTP_REFERER} ^ejemplo2\.com$ [NC]
RewriteRule .* - [F]

 

Evitar acceso mediante el navegador a una carpeta sin el archivo "index"

# evitar acceso a carpeta sin index
Options All -Indexes

 

Nota: lo contrario, es decir, permitir el acceso a carpetas sin index es:

# evitar acceso a carpeta sin index
Options All +Indexes

 

 

 

3.- Re-escritura y redirección

 

Quitar siempre las www de la URL

Es importante no repetir URLs -mostrando el mismo contenido con y sin www-, ya que penaliza el posicionamiento.

# quitar las www
RewriteCond %{http_host} ^www\.netandsoftware\.com [NC]
RewriteRule ^(.*)$ http://netandsoftware.com/$1 [R=301,L]

 

Mostrar siempre las www de la URL

# mostrar siempre las www
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\.netandsoftware\.com$
RewriteRule (.*) http://www.netandsoftware.com/$1 [R=301,L]

 

Cambiar la página de carga por defecto

#orden de los ficheros de carga por defecto
DirectoryIndex inicio.html index.htm index.html index.php

 

Nota: El orden es muy importante porque da la preferencia de los ficheros de carga

 

Camuflar el tipo de ficheros

Esto se hace para que sea más dificil detectar el tipo de ficheros que se usa

# camuflar archivos PHP como NAS
AddType application/x-httpd-php .nas

 

Redirigir el contenido en función del navegador usado

RewriteCond %{HTTP_USER_AGENT} ^Opera/*
RewriteRule ^index\.html$ index.opera.html [L]
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/*
RewriteRule ^index\.html$ index.mozilla.html [L]
RewriteRule ^index\.html$ index.html [L]

 

Nota: Los asteriscos indican el uso de cualquier versión de ese navegador, por ejemplo:dicarse a continuación de la barra, como "Mozilla/3.0", "Mozilla/4.0", "Mozilla/5.0", etc.

 

Redireccionar una antigua página a la nueva

# redireccionar permanentemente
RewriteRule ^(.*)$ http://www.minuevodominio.com/$1 [R=301,L]

 

Redireccionar una antigua página a la nueva, a través de ReDirect

# redireccionar permanentemente
redirect 301 / http://www.dominio.com/

 

Redireccionar una web a otro sitio provisionalmente (redirección 302)

# redireccionar provisionalmente
RewriteRule ^(.*)$ http://www.minuevodominio.com/$1 [R=302,L]

 

Redireccionar de un archivo a otro

# redireccionar un antiguo fichero a otra nueva dirección
Redirect /antiguo.html http://dominio.com/nuevo.html

 

Redireccionar una IP concreta a una página concreta

Puede servir para avisar a una persona con una IP concreta de que ha sido baneada.

# redireccionar una IP a una página concreta de nuestra web
RewriteCond %{REMOTE_ADDR} 100.101.102.103
RewriteRule .* pagina-concreta.html [R]

 

Redireccionar toda una web a un directorio del mismo dominio

# traslada todas las URL antiguas a la nueva carpeta en el mismo dominio
RewriteCond %{HTTP_HOST} ^midominio\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.midominio\.com$
RewriteCond %{REQUEST_URI} !^/webencarpeta/
RewriteRule (.*) /webencarpeta/$1 [L]

 

Quitar una palabra de una URL

En el siguiente ejemplo, de http://www.midominio.com/quitar/prueba.htmlhttp://www.midominio.com/prueba.html

# quitar una cadena de una URL
RewriteRule ^quitar/(.+)$ http://www.midominio.com/$1 [R=301,L]

 

URL amigable (uso de fin de interrogación en RewriteRule)

Cambia una URL como http://www.midominio.com/articulos-blog?catid=27http://www.midominio.com/articulos-blog de forma permanente.

# Uso de ?
RewriteCond %{REQUEST_URI} ^/articulos-blog$ [NC]
RewriteCond %{QUERY_STRING} ^catid=(.*)$ [NC]
RewriteRule ^(.*)$ /articulos-blog? [R=301,L]

 

URL amigable (uso del tanto por ciento en RewriteRule)

Cambia una URL como http://www.dominio.com/noticias?id=127 a http://www.dominio.com/noticias/127 de forma provisional.

# Uso del %
RewriteCond %{REQUEST_URI} ^/noticias$ [NC]
RewriteCond %{QUERY_STRING} ^id=(.*)$ [NC]
RewriteRule ^(.*)$ /noticias/%1? [R=302,L]

 

Mejorando el posicionamiento SEO con RewriteRule

Cambia una URL con la cadena "ps" por una URL con la cadena "posicionamiento-seo" que determina mejor el contenido de las URLs.

# mejorando el posicionamiento SEO sustituyendo caracteres sin sentido por otros que determinan el contenido
RewriteRule ^(.*)/ps/(.*)$ $1/posicionamiento-seo/$2 [L,R=301]

 

Transformación de una URL con agrupamiento de caracteres mayúsculas y minúsculas

Cambia la URL de este tipo http://www.midominio.com/pais/Espana.php a http://www.midominio.com/codigo/pais.php?nombre=Espana

# detectar palabras en mayúsculas o minúsculas o combinacion de ambas
RewriteRule ^pais/([a-zA-Z_-]+).php$ codigo/pais.php?nombre=$1 [L]

 

Paso de parámetros en la URL y doble parámetro

Cambia una URL como http://www.midominio.com/fecha/2013/12.html a http://www.midominio.com/fecha.php?mes=12&anio=2013 de forma permanente

# Doble parámetro
RewriteRule ^fecha/(.+)/(.+)\.html$ fecha.php?mes=$2&anio=$1 [R=301,L]

 

 

 

4.- Compresión y caché

 

Comprimir ficheros de texto, HTML, JavaScript, CSS y XML

# comprimir focheros texto, html, javascript, css, xml
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript

 

También en una sóla línea:
AddOutputFilterByType DEFLATE text/plain text/html text/xml text/css application/xml application/xhtml+xml application/rss+xml application/javascript application/x-javascript

 

Cachear ficheros de imágenes a una semana

#Cache del navegador, imagenes cacheadas a una semana: 604800 segundos
<FilesMatch "\.(ico|jpg|jpeg|png|gif)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>

 

Cachear ficheros JPG a un mes

#Cache del navegador, imágenes cacheadas a un mes: 2592000 segundos
<FilesMatch "\.(jpg|jpeg)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>

 

Cachear con ExpiresByType y el intervalo legible

#caché que expira las imágenes JPG en 6 meses, los CSS en 2 meses, y los JavaScripts en 2 semanas
ExpiresActive on
ExpiresByType image/jpg "access plus 6 months"
ExpiresByType text/css "access plus 2 months"
ExpiresByType text/javascript "access plus 2 weeks"

 

Cachear ficheros a un año con ExpiresDefault y el intervalo en segundos

ExpiresActive On
ExpiresDefault A0
#  caché expira en un año (A9030400) para los ficheros FLV, ICO, AVI, MOV, PPT, DOC, MP3, WMV y WAV
<FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
ExpiresDefault A9030400
</FilesMatch>

 

 

 

5.- Otros funcionalidades en el .htaccess

 

Asignar permisos CHMOD automáticamente al fichero .htpasswd

# permiso automático del fichero que protege el directorio .htpasswd
chmod .htpasswd files 640

 

Asignar permisos CHMOD automáticamente al fichero .htaccess

# permiso automático del fichero .htaccess
chmod .htaccess files 644

 

Asignar permisos CHMOD automáticamente a ficheros PHP

# permisos automáticos de archivos PHP
chmod php files 600

 

Limitar la subida de ficheros más grandes que una cantidad

Protege de ciertos ataques DOS, limitando el tamaño de archivos que se suben al servidor.

# limitar la subida a 10 MB
LimitRequestBody 10000000

 

Permitir al usuario descargar archivos multimedia

Generalmente sólo se permiten abrir

# permitir descarga de ficheros multimedia AVI, MPG, WMV y MP3
AddType application/octet-stream .avi
AddType application/octet-stream .mpg
AddType application/octet-stream .wmv
AddType application/octet-stream .mp3

 

Personalizar errores 404

ErrorDocument 404 /errores/404.html

 

Nota: Para otros tipos de errores es similar, se coloca el número de error y la dirección donde queremos redireccionar al visitante.

 

Corregir pequeños errores de ortografía en las URL

CheckSpelling On

 

Especificar el e-mail por defecto del administrador del servidor

# e-mail del administrador del servidor
SetEnv SERVER_ADMIN Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.

 

Especificar el lenguaje por defecto del servidor

# lenguaje por defecto del servidor
DefaultLanguage en-US

 

Forzar el uso del protocolo seguro SSL

# fuerza el uso de SSL en la web
SSLOptions + StrictRequire
SSLRequireSSL

 

Redireccionar usuarios con protocolo seguro HTTPS a una carpeta en particular

Esto se puede necesitar cuando una web tiene una tienda online en una carpeta específica

RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} carpeta
RewriteRule ^(.*)$ https://www.midominio.com/carpeta/$1 [R,L]

 

Evitar la visualización de errores al visitante

# evitar que los errores se muestren al usuario
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off

 

Registrar errores de PHP en un fichero log

# registrar errores en log
php_flag log_errors on
php_value error_log /logs/php_error.log

 

Limitar el número de visitas al mismo tiempo a 400

# limitar el número de visitas a 400
MaxClients 400

 

Denegar la ejecución de scripts CGI

# bloquear CGIs
Options -ExecCGI
AddHandler cgi-script .php .pl .py .jsp .asp .sh .cgi

 

Declarar tipos MIME

# agregar tipos mime
AddType application/x-shockwave-flash .swf
AddType video/x-flv .flv
AddType image/x-icon .ico

 

Definiendo el juego de caracteres

Pasando el juego de caracteres se evita el mostrar un error 500 por este motivo

AddDefaultCharset utf-8

 

Desactivar los Entities Tags

FileETag none

 

 

 

6.- Recomendaciones sobre el fichero .htaccess

  1. El tamaño es importante: cuanto más pequeño sea el fichero .htaccess menos tiempo tardará el servidor en procesarlo cada vez que se realiza una petición a tu servidor. Esto implica una pérdida de rendimiento en la carga de las páginas de tu sitio web si este fichero se hace demasiado grande.
  2. La directiva [L] es realmente interesante y hace que el servidor no procese más el archivo una vez que se cumple esa regla. Por lo que incorpora siempre que puedas esta directiva en los RewriteRule.
  3. La organización es fundamental: dado lo complicada que pueden ser ciertas líneas en el código de .htaccess, es imprescindible comentar adecuadamente tu fichero para que la modificación sea rápida y sencilla. No escatimes en comentarios, y organiza adecuadamente las instrucciones de tu .htaccess.
  4. Protege adecuadamente este archivo de reescrituras ajenas, puede llegar a ser muy peligroso.
  5. La denegación de permisos debe estar lo primero, antes de ejecutar RewriteCond y RewriteRule.

 

 

7.- Simbología del fichero .htaccess

De forma breve, los códigos y símbolos en el archivo .htaccess son:

# Puesto al inicio de una línea, ignora esa línea.

[F] Forbidden: prohíbe un acceso y fuerza un acceso denegado. 403 Forbidden.

[L] Last rule: indica que es la última regla que debe aplicarse.

[N] Next: indica continuación hasta que las directivas sean logradas.

[G] Gone: indica al servidor que ya no existe, es decir, entrega "Gone".

[P] Proxy: instruye al servidor para manejar los pedidos por mod_proxy.

[C] Chain: encadena la regla actual con la regla anterior.

[R] Redirect: indica redirección. Puede haber de varios tipos 301 (permanente), 302 (provisional).

[NC] No Case: no sensible a mayúsculas, es decir, indica que no debe distinguirse entre mayúsculas y minúsculas.

[PT] Pass Through: pasa el URL a Apache para seguir procesando.

[OR] Or: indica que la expresión debe interpretase como una alternativa junto a la siguiente: ó lógico. Si se omite, se sobreentiende que es una y lógica, por defecto.

[NE] No Escape: analiza las salidas de caracteres sin escapar.

[NS] No Subrequest: para saltar directivas de sub-pedidos internos.

[QSA] Append Query String: agrega un query string al final de la expresión (URL).

[S=x] Skip: salta las siguientes "x" reglas del fichero .htaccess.

[E=variable:value] Environmental Variable: para añadir un valor a una variable.

[T=MIME-type] Mime Type: declara mime-type al recurso.

[] dentro de los paréntesis se encierran carácteres que definen los resultados.

[]+ se utiliza para hacer combinaciones.

[^] excluye los carácteres que pongamos dentro del paréntesis. Ejemplo [^abc] excluye las letras a, b y c.

[a-z] letras desde la a hasta la z (en minúsculas).

[A-Z] letras desde la A hasta la Z (en mayúsculas).

[a-zA-Z] sólo letras (mayúsculas y minúsculas).

[a-z]{1,10} palabras en minúsculas entre 1 y 10 caracteres.

[0-9] sólo un número.

[0-9]{4} números de 4 cifras.

(.*) cualquier expresión, incluida la vacía.

a{n} especifica el número de caracteres.

a{n,} especifica el número "o más" de caracteres.

a{n,m} especifica un rango entre "n" y "m". Ejemplo s{3,6} será 3 "eses", 4 "eses", 5 "eses" o 6 "eses".

() es un agrupamiento de caracteres.

^ marca el inicio de un argumento.

$ marca el fin de un argumento.

? establece como opcional el caracter que le precede. Si se pone este símbolo al final del segundo argumento del RewriteRule, indicará que no se ponga nada más en la URL.

! es la negación. Ejemplo: "!string" resulta "no string".

. indica cualquier caracter arbitrario.

- instrucción “not to”.

+ indica uno o más caracteres del caracter que le precede. Por ejemplo: (.+) indica cualquier cadena de uno o más caracteres.

| es el ó lógico, condición de alternancia. Ejemplo (a|b) es el caracter a o el b.

\ escapa caracteres, es decir, toma el caracter que le sigue literalmente. Por ejemplo: “\.” indica literalmente un punto, ya que sin la barra invertida indicaría cualquier caracter.

/* indica cero o más "/".

.* indica cualquier caracter, incluido que no exista caracter.

^$ indica una cadena vacía.

^.*$ indica "todo", toda la cadena.

[^/.] define un caracter que no sea "/" ni ".".

[^/.]+ define, ningún número de caracter que tenga "/" o ".".

http:// es literalmente “http://”.

^dominio.* define una cadena que comience con "dominio" y le siga cualquier número de caracteres.

^dominio\.com$ define exactamente “dominio.com”.

-d prueba si la cadena es un directorio existente.

-f prueba si la cadena es un archivo existente.

-s prueba si el archivo en la cadena no tiene valor cero.

 

Y espero que con estos ejemplos, tengan resueltas muchas de las opciones posibles para configurar su propio .htaccess según sus necesidades.

 

Comentarios   

-1 #41 Directorio de idioma como base al iniciocarlos carrera 06-07-2014 00:08
Cito a Rafael:
Hola Carlos, es que no sé bien lo que quieres hacer. Si quieres redireccionar el tráfico de tu web a /es sería
RewriteRule ^(.*)$ /es/$1 [R=301,L] No sé si es lo que buscas, saludos ;)

Hola gracias por contestar, lo que pretendo es que cuando un usuario ponga www.ejemplo.com, lo redireccione a www.ejemplo.com/es/ de todas formas he probado el código y no me ha funcionado, también he probado
RewriteRule ^(.*)$ http://www.ejemplo.com/es/$1 [R=301,L]
De paso queria comentarte otra cosa en la que he estado practicando...yo utilizo tres páginas difrentes ya que tienen contenido diferente index, productos y noticias pero si hago esto de abajo siempre me carga la mismo imagino porque lleva la [L] pero si la quito tampoco va
RewriteRule ^(.+)/(.+)/$ /productos.php?lang= $1&products=$2 [L]
RewriteRule ^(.+)/(.+)/$ /noticias.php?lang=$ 1&news=$2 [L]
Hay alguna manera de utilizar otras páginas ademas del index?
gracias y saludos!
Citar
+1 #42 RE: .htaccess en profundidad, la guía completaRafael 06-07-2014 10:27
Cito a carlos carrera:
Cito a Rafael:
Hola Carlos, es que no sé bien lo que quieres hacer. Si quieres redireccionar el tráfico de tu web a /es sería
RewriteRule ^(.*)$ /es/$1 [R=301,L] No sé si es lo que buscas, saludos ;)

Hola gracias por contestar, lo que pretendo es que cuando un usuario ponga www.ejemplo.com, lo redireccione a www.ejemplo.com/es/ de todas formas he probado el código y no me ha funcionado, también he probado
RewriteRule ^(.*)$ http://www.ejemplo.com/es/$1 [R=301,L]
De paso queria comentarte otra cosa en la que he estado practicando...yo utilizo tres páginas difrentes ya que tienen contenido diferente index, productos y noticias pero si hago esto de abajo siempre me carga la mismo imagino porque lleva la [L] pero si la quito tampoco va
RewriteRule ^(.+)/(.+)/$ /productos.php?lang=$1&products=$2 [L]
RewriteRule ^(.+)/(.+)/$ /noticias.php?lang=$1&news=$2 [L]
Hay alguna manera de utilizar otras páginas ademas del index?
gracias y saludos!


Hola de nuevo,

Antes de nada, ¿tienes otras redirecciones hechas de manera que puedan interferir en el código que te puse?

Prueba de todas formas esto otro:
RewriteCond %{HTTP_HOST} ^(www.)?ejemplo.com$
RewriteCond %{REQUEST_URI} !^/es/
RewriteRule ^(.*)$ /es/$1 [L,R=301]

Respecto a la segunda cuestión, es normal que no te funcione, las dos sentencias RewriteRule tienen la misma condición (no tiene sentido). Quizás si explicaras con palabras detalladas lo que quieres, te podría ayudar más.

Saludos.
Citar
+1 #43 Sentencias con la misma condición para distintas fuentescarlos carrera 06-07-2014 12:27
Hola Rafael, el tema de las sentencias con la misma condición es el siguiente, yo por motivos de diseño y mucho contenido tengo la web separada en diferentes fuentes. index.php, productos.php, noticias.php, entonces yo quiero poder acceder a estas fuentes por estas url amigables www.ejemplo.com/es/, www.ejemplo.com/es/noticias, www.ejemplo.com/es/productos y que cada fuente tuviera su grupo de sentencias
Código:
RewriteRule ^(.+)/(.+)/p-(.+)$ /noticias.php?lang=&news=&p= [L]
RewriteRule ^(.+)/(.+)/$ /noticias.php?lang=&news= [L]
RewriteRule ^(.+)/$ /noticias.php?lang=[L]
RewriteRule ^(.+)/(.+)/$ /productos.php?lang=&prods= [L]
RewriteRule ^(.+)/$ /productos.php?lang=[L]

Las sentencias tienen la misma condición pero la fuente que las carga es diferente con secciones categorías...espero haberme explicado bien, gracias por tu tiempo
Carlos
Citar
0 #44 RE: .htaccess en profundidad, la guía completaRafael 06-07-2014 15:16
Cito a carlos carrera:
Hola Rafael, esta vez si ha funcionado pero no ha creado el efecto deseado :( el tema principal era reducir duplicado de contenido entonces entiendo que www.ejemplo.com/ y www.ejemplo.com/es/
es lo mismo ya que las dos cargan la página index.php y lo que quería es evitar el primero, pero si hago la redirección definitiva entonces el /es/ me queda siempre y cucando cambio de idioma me queda www.ejemplo.com/es/ca/ Por eso, como mostré en el primer mensaje, yo creía que tenia que ser cuestión del rewriteBase (rewriteBase /es/) entiendo que así lo trata como un directorio y si un usuario cambia de idioma no habría problema.
Te mando la otra consulta en otro mensaje (me da un error de mensaje demasiado largo:), gracias por tu tiempo. Carlos


Hola de nuevo,

Añade en las condiciones:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

el RewriteBase mantiene un directorio como activo, pero creo que no es lo que quieres, ya que no tomaría el / como base, si no /es.

Saludos
Citar
0 #45 RE: .htaccess en profundidad, la guía completaRafael 06-07-2014 15:20
Cito a carlos carrera:
Hola Rafael, el tema de las sentencias con la misma condición es el siguiente, yo por motivos de diseño y mucho contenido tengo la web separada en diferentes fuentes. index.php, productos.php, noticias.php, entonces yo quiero poder acceder a estas fuentes por estas url amigables www.ejemplo.com/es/, www.ejemplo.com/es/noticias, www.ejemplo.com/es/productos y que cada fuente tuviera su grupo de sentencias
Código:
RewriteRule ^(.+)/(.+)/p-(.+)$ /noticias.php?lang=&news=&p= [L]
RewriteRule ^(.+)/(.+)/$ /noticias.php?lang=&news= [L]
RewriteRule ^(.+)/$ /noticias.php?lang=[L]
RewriteRule ^(.+)/(.+)/$ /productos.php?lang=&prods= [L]
RewriteRule ^(.+)/$ /productos.php?lang=[L]

Las sentencias tienen la misma condición pero la fuente que las carga es diferente con secciones categorías...espero haberme explicado bien, gracias por tu tiempo
Carlos


Esta consulta es demasiado larga (y necesita más de 2 respuestas), tendría que hacerte demasiadas preguntas al respecto. Siento no poder ayudarte más. Puedes esperar a que un usuario te conteste, dejar tu pregunta en algún foro a ver si alguien te responde, o contratar nuestro servicio de Consulta Joomla! por 9,50 euros, donde te la resolveríamos sin problema mediante un ticket. En la consulta Joomla! entran las redirecciones por htaccess.
www.netandsoftware.es/productos/soporte-tecnico/producto_curso/147-soporte-tecnico-joomla-3-x

Siento el inconveniente.

Un saludo.
Citar
0 #46 Sentencias iguales para distintas fuentescarlos carrera 06-07-2014 21:37
Citación:
Esta consulta es demasiado larga (y necesita más de 2 respuestas), tendría que hacerte demasiadas preguntas al respecto. Siento no poder ayudarte más.
Hola Rafael, no te preocupes esta ya la he solucionado, ademas fácilmente (no había caído) con includes con php para cargar en el index.php las diferentes fuentes (noticias.php, productos.php...) y creando un solo juego de sentencias para index.php
De todas formas muchas gracias por tu tiempo, me ha ayudado a enfocarlo de otra manera, saludos
Carlos
Citar
0 #47 Bloquear acceso a dirección inexistenteJPSM 10-08-2014 20:05
Hola a todos, somos un grupo deportivo que tiene una pagina web hecha en wordpress. Desde hace un tiempo atrás se vienen produciendo accesos a una URL que formó parte del blog provinientes desde bots, robots, arañas, etc de todo el mundo. Lo que queremos es bloquear el acceso ya que esta URL no forma parte de la página web ni va a formar parte. La URL que se viene repitiendo es la siguiente:
www.midominio.com/?page_id=537/resto de la direccion que varia
La constante que se repite es ?page_id=537.
Lo que queremos es terminar con esos intentos de acceso indebido pues ya no han suspendido varias veces el dominio por el altisimo tráfico generado.

Un saludo y gracias
Citar
0 #48 RE: .htaccess en profundidad, la guía completaRafael 10-08-2014 21:38
Cito a JPSM:
Hola a todos, somos un grupo deportivo que tiene una pagina web hecha en wordpress. Desde hace un tiempo atrás se vienen produciendo accesos a una URL que formó parte del blog provinientes desde bots, robots, arañas, etc de todo el mundo. Lo que queremos es bloquear el acceso ya que esta URL no forma parte de la página web ni va a formar parte. La URL que se viene repitiendo es la siguiente:
www.midominio.com/?page_id=537/resto de la direccion que varia
La constante que se repite es ?page_id=537.
Lo que queremos es terminar con esos intentos de acceso indebido pues ya no han suspendido varias veces el dominio por el altisimo tráfico generado.

Un saludo y gracias


Hola,

Prueba con lo siguiente:

RewriteCond %{QUERY_STRING} ^(.*)page_id=537/(.* )$ [NC]
RewriteRule ^(.*)$ - [F,L]

Debe lanzar un forbidden (403) cada vez que se intenta acceder a una URL con esa cadena

Saludos ;-)
Citar
0 #49 Cambiar archivo de urlCesar 25-08-2014 16:53
Hola a todos
debido a unos cambios en la web, necesito que en todas las urls de la pagina cambiar una extension de un fichero, es decir, por ejemplo, la primera url cambiar solo la extension del fichero fckeditor.html a fckeditor.html (de html a htm). Necesito que se cambia en la url de todas las partes de la web, ya que en diferentes sitios se llama a ese fichero, que cambiaria de extension.
Por favor, a ver si pueden ayudarme. Gracias.

http://www.miweb.com/administracion/includes/plugins/fckeditor/editor/fckeditor.html?InstanceName=cuerpo&Toolbar=cmrb

http://www.miweb.com/administracion/includes/plugins/fckeditor/editor/fckeditor.htm?InstanceName=cuerpo&Toolbar=cmrb
Citar
0 #50 RE: .htaccess en profundidad, la guía completaIñi 26-09-2014 13:10
Quiero que la web se vaya indexando con google, bing, etc .... y doy permiso utilizando el User-Agent pero si el navegador no es el indicado requerir el usuario y contraseña.
Gracias de antemano.

Asi no me funciona:
AuthUserFile /directorio/del/archivo/.htpassword
AuthGroupFile /dev/null
AuthName "Pronto todo el contenido de esta web será público, de momento .. Acceso restringido."
AuthType Basic
require user user1
require user user2
require user user3
require user invitado
require user user4
order allow,deny
allow from all

SetEnvIfNoCase User-Agent .*google.* search_robot
SetEnvIfNoCase User-Agent .*yahoo.* search_robot
SetEnvIfNoCase User-Agent .*bot.* search_robot
SetEnvIfNoCase User-Agent .*ask.* search_robot
SetEnvIfNoCase User-Agent .*bing.* search_robot
SetEnvIfNoCase User-Agent .*msn.* search_robot
Order Deny,Allow
Deny from All
Allow from env=search_robot
Citar
0 #51 RE: .htaccess en profundidad, la guía completaJorgeQS 02-10-2014 19:23
Hola a todos.

Llevo meses con una web de url cortas, pero se me presenta el problema de que a estas urls se accede mediante http://host/sSaeR por ejemplo. El caso que quiero redireccionar a decode.php cuando se entre a esa URL y también mostrar los errorDocuments, porque ahora mismo, si la URL no existe en la base de datos siempre me lleva a decode.php. Que puedo hacer?

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) decode.php?surl=$1 [L,QSA]

ErrorDocument 401 /errordocs/error-404 .php
ErrorDocument 403 /errordocs/error-404 .php
ErrorDocument 404 /errordocs/error-404 .php
ErrorDocument 500 /errordocs/error-404 .php
ErrorDocument 502 /errordocs/error-404 .php
ErrorDocument 503 /errordocs/error-404 .php
ErrorDocument 504 /errordocs/error-404 .php
ErrorDocument 505 /errordocs/error-404 .php

Gracias por cualquier ayuda.
Citar
0 #52 no consigo hacer una redireccion 301Jordi 03-06-2015 12:48
Buenas tengo un problema
Yo necessitaria redireccionar esta url:
http://www.totmampara.com/mampara.asp?id_clase=15&id_tipo=5&id_model=339

A esta otra:
http://www.totmampara.com/15/5/339/

teniendo en cuenta que id_clase id_tipo y id_model son variable

he probado mil cosas i no lo consigo
lo ultimo que he probado es esto:

RewriteCond %{REQUEST_URI} /mampara.asp$ [NC]
RewriteCond %{QUERY_STRING} ^id_clase=([0-9]$)&i d_tipo=([0-9]$)&id_m odel=([0-9]$) [NC]
RewriteRule ^.*$ http://www.totmampara.com/$1/$2/$3/redirect301 [L,R=301]

me podeis ayudar??
Citar
0 #53 RE: .htaccess en profundidad, la guía completaRafael 03-06-2015 14:10
Cito a Jordi:
Buenas tengo un problema
Yo necessitaria redireccionar esta url:
http://www.totmampara.com/mampara.asp?id_clase=15&id_tipo=5&id_model=339

A esta otra:
http://www.totmampara.com/15/5/339/

teniendo en cuenta que id_clase id_tipo y id_model son variable

he probado mil cosas i no lo consigo
lo ultimo que he probado es esto:

RewriteCond %{REQUEST_URI} /mampara.asp$ [NC]
RewriteCond %{QUERY_STRING} ^id_clase=([0-9]$)&id_tipo=([0-9]$)&id_model=([0-9]$) [NC]
RewriteRule ^.*$ http://www.totmampara.com/$1/$2/$3/redirect301 [L,R=301]

me podeis ayudar??


Hola Jordi,

Así de principio, veo varias cosas mal.

Sólo permites que redireccione un caracter numérico, es decir, el primer número después del id. Si es un 45, pues ya no lo hace bien.

También la segunda línea no está bien, sería %1,%2 y %3 en vez de $1, $2 y $3.

Aunque en principio es "indistinto", yo pondría ^(.*)$ en vez de ^.*$

La sentencia del query_string la inicias bien con ^ pero debes finalizarla con $.

Y yo creo que es mejor programarlo en 3 sentencias query_string en vez de en una con ampersand.

Fïjate un poco en los ejemplos, sobre todo, en URL amigable (uso del tanto por ciento en RewriteRule), a ver si te sirve..

Saludos
Citar
0 #54 RE: .htaccess en profundidad, la guía completajorgej28 07-07-2015 19:55
Hola podrías ayudarme con algo?

RewriteCond %{HTTP_REFERER} !www.tudominio.com/a dministrator/

RewriteCond %{QUERY_STRING} !^palabraclave

RewriteRule ^.*administrator/? /not_found [R,L]

Necesito que en lugar de mandarme a /not_found me mande a la pagina principal en este caso www,tudominio.com

Saludos y muy buen artículo
Citar
0 #55 Cambiar ip por url simbólicaGoyo 30-07-2015 12:43
Buenos días:
A ver si puedes echarme una mano.
Mi problema es el siguiente. Tengo una aplicación php en un servidor de una intranet local a la que se accede con una redirección "meta refresh" desde un archivo html a http://192.168.1.99/miAplicacion/index.php.
No deseo que los usuarios conozcan la ip de la máquina, por lo que me gustaría que en la barra de navegación le apareciera algo como http://www.miaplicacion.int/miAplicacion en lugar de http://192.168.1.99/miAplicacion/.
He probado varias cosas, pero siempre me redirecciona a otros sitios ya existentes, y lo que quiero realmente es una sustitución al estilo dns.
Muchas gracias
Citar
0 #56 negar accesomarwin jose finol vi 19-11-2015 06:25
de que manera usando .haccess se puede evitar que el usuario visitante de mi web pueda ver mi codigo fuente.. o acaso hay otra opcion para evitar eso. gracias
Citar
0 #57 RE: .htaccess en profundidad, la guía completaRafael 19-11-2015 11:32
Cito a marwin jose finol vi:
de que manera usando .haccess se puede evitar que el usuario visitante de mi web pueda ver mi codigo fuente.. o acaso hay otra opcion para evitar eso. gracias


Hola Marwin,

No entiendo bien tu pregunta. Si lo que quieres es que no se vea el HTML de tu web, lo único que puedes hacer es banear la IP. Aún así, si usa un proxy podrá ver tu página, y, por tanto, tu código. Siempre que alguien acceda a tu página y la vea es porque está viendo el código (y por eso no entiendo bien tu pregunta). Podrías deshabilitar el botón derecho al navegar en tu web para que no puedan pinchar en el botón derecho y seleccionar "ver código fuente", aunque no es muy eficaz, y cualquiera que sepa un mínimo sabe saltárselo.

Si lo que quieres es que no vean los PHP de tu web que generan ese código HTML (los PHP es lo que entiendo yo por código fuente), en principio, éstos no se ven a menos que des permisos expresos a los archivos. Debes entender que darle permisos a ficheros (o hacer que se vean públicamente) es una locura frente a la seguridad. Tus archivos deben estar a 644 y tus directorios a 755 y los propietarios y grupos al que pertenezcan esos archivos y directorios públicos deben ser los correctos.

Saludos
Citar

Escribir un comentario


Código de seguridad
Refescar

Resuelva su DUDA Joomla!

Pregunte una duda a N&S. Si es sencilla, nosotros la responderemos en el menor tiempo posible, y saldrá publicada en nuestra FAQ de Joomla! 3.x
Email:
Asunto:
Pregunta FAQ Joomla! 3.x:
Pregunta de control: ¿Cuántas ruedas tiene un triciclo?

Diccionario de Internet

Explicaciones sencillas a cualquier término informático de Internet o Joomla!.

Compártelo

Suscríbete al Boletín

Boletín Mensual con un resumen de las noticias de seguridad, novedades y artículos de interés de Joomla!
Términos y Condiciones

Últimas Noticias

Últimos Artículos Blog

Web 2.0. Desarrollo Joomla! y Programación Web. Cursos Online Videoconferencia, Amplia Experiencia en Joomla!, Posicionamiento Orgánico SEO.