Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
htaccess_en_profundidad [2015/02/23 11:40] 10.12.12.54 |
htaccess_en_profundidad [2017/03/27 17:44] (actual) |
||
|---|---|---|---|
| Línea 2: | Línea 2: | ||
| - | Índice | ||
| - | Introducción al .htaccess | ||
| - | Bloqueando y permitiendo acceso | ||
| - | Re-escritura y Redirección | ||
| - | Compresión y caché | ||
| - | Otras funcionalidades del .htaccess | ||
| - | Recomendaciones sobre el fichero .htaccess | ||
| - | Simbología del fichero .htaccess | ||
| - | + | ||
| - | 1.- Introducción | + | |
| + | |||
| + | ====== 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. | 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. | ||
| Línea 32: | Línea 27: | ||
| - | 2.- Bloqueando y Permitiendo Acceso | + | ====== 2.- Bloqueando y Permitiendo Acceso ====== |
| - | Denegar el acceso a un directorio -carpeta- del servidor | + | Denegar el acceso a un directorio del servidor |
| Crear un fichero .htaccess dentro de la carpeta con las instrucciones: | Crear un fichero .htaccess dentro de la carpeta con las instrucciones: | ||
| Línea 56: | Línea 52: | ||
| Bloquear el acceso a un archivo específico | Bloquear el acceso a un archivo específico | ||
| - | #bloquear un fichero concreto | + | #bloquear un fichero concreto |
| - | <Files archivo_a_bloquear.html> | + | <Files archivo_a_bloquear.html> |
| - | order allow,deny | + | order allow,deny |
| - | deny from all | + | deny from all |
| Redireccionar visitantes a una dirección alternativa, menos a una IP específica | Redireccionar visitantes a una dirección alternativa, menos a una IP específica | ||
| - | #Redireccionar a todos a otrositio.com excepto una IP concreta | + | #Redireccionar a todos a otrositio.com excepto una IP concreta |
| - | ErrorDocument 403 http://www.otrositio.com | + | ErrorDocument 403 http://www.otrositio.com |
| - | order deny,allow | + | order deny,allow |
| - | deny from all | + | deny from all |
| - | allow from 100.101.102.103 | + | allow from 100.101.102.103 |
| Denegar un rango completo de IP | Denegar un rango completo de IP | ||
| Línea 73: | Línea 69: | ||
| 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 | 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 | + | # Primer caso: deniega el acceso a 256 IPs, desde la 100.100.100.0 hasta la 100.100.100.255 |
| - | order allow,deny | + | order allow,deny |
| - | deny from 100.100.100. | + | deny from 100.100.100. |
| - | # Segundo caso: deniega 65536 IP | + | # Segundo caso: deniega 65536 IP |
| - | order allow,deny | + | order allow,deny |
| - | deny from 100.100. | + | deny from 100.100. |
| - | # Tercer caso: deniega todas las IP que empiezan por 100, que son más de 16 millones | + | # Tercer caso: deniega todas las IP que empiezan por 100, que son más de 16 millones |
| - | order allow,deny | + | order allow,deny |
| - | deny from 100. | + | deny from 100. |
| Permitir un rango concreto de IP a la web | Permitir un rango concreto de IP a la web | ||
| - | # permitir acceso a rango 100.100.100.0 hasta 100.100.100.255 | + | # permitir acceso a rango 100.100.100.0 hasta 100.100.100.255 |
| - | order deny,allow | + | order deny,allow |
| - | allow from 100.100.100. | + | allow from 100.100.100. |
| Denegar acceso de un dominio concreto | Denegar acceso de un dominio concreto | ||
| - | # bloquear acceso a un dominio | + | # bloquear acceso a un dominio |
| - | order allow,deny | + | order allow,deny |
| - | allow from all | + | allow from all |
| - | deny from .*dominio\.com.* | + | deny from .*dominio\.com.* |
| Denegar acceso a visitantes que vengan de un dominio concreto | Denegar acceso a visitantes que vengan de un dominio concreto | ||
| - | # bloquear acceso visitas desde ejemplo1.com y ejemplo2.com | + | # bloquear acceso visitas desde ejemplo1.com y ejemplo2.com |
| - | RewriteCond %{HTTP_REFERER} ejemplo1\.com [NC,OR] | + | RewriteCond %{HTTP_REFERER} ejemplo1\.com [NC,OR] |
| - | RewriteCond %{HTTP_REFERER} ejemplo2\.com [NC,OR] | + | RewriteCond %{HTTP_REFERER} ejemplo2\.com [NC,OR] |
| - | RewriteRule .* - [F] | + | RewriteRule .* - [F] |
| Denegar acceso a una hora específica | Denegar acceso a una hora específica | ||
| - | # bloquear acceso una hora | + | # bloquear acceso una hora |
| - | RewriteCond %{TIME_HOUR} ^12$ | + | RewriteCond %{TIME_HOUR} ^12$ |
| - | RewriteRule ^.*$ - [F,L] | + | RewriteRule ^.*$ - [F,L] |
| Denegar acceso a un directorio a varias horas concretas | Denegar acceso a un directorio a varias horas concretas | ||
| - | # bloquear acceso en varias horas | + | # bloquear acceso en varias horas |
| - | RewriteCond %{TIME_HOUR} ^(12|13|14|15)$ | + | RewriteCond %{TIME_HOUR} ^(12|13|14|15)$ |
| - | RewriteRule ^.*$ - [F,L] | + | RewriteRule ^.*$ - [F,L] |
| Denegar acceso a muchos proxies | Denegar acceso a muchos proxies | ||
| - | # bloqueo de Proxies | + | # bloqueo de Proxies |
| - | RewriteCond %{HTTP:VIA} !^$ [OR] | + | RewriteCond %{HTTP:VIA} !^$ [OR] |
| - | RewriteCond %{HTTP:FORWARDED} !^$ [OR] | + | RewriteCond %{HTTP:FORWARDED} !^$ [OR] |
| - | RewriteCond %{HTTP:USERAGENT_VIA} !^$ [OR] | + | RewriteCond %{HTTP:USERAGENT_VIA} !^$ [OR] |
| - | RewriteCond %{HTTP:X_FORWARDED_FOR} !^$ [OR] | + | RewriteCond %{HTTP:X_FORWARDED_FOR} !^$ [OR] |
| - | RewriteCond %{HTTP:PROXY_CONNECTION} !^$ [OR] | + | RewriteCond %{HTTP:PROXY_CONNECTION} !^$ [OR] |
| - | RewriteCond %{HTTP:XPROXY_CONNECTION} !^$ [OR] | + | RewriteCond %{HTTP:XPROXY_CONNECTION} !^$ [OR] |
| - | RewriteCond %{HTTP:HTTP_PC_REMOTE_ADDR} !^$ [OR] | + | RewriteCond %{HTTP:HTTP_PC_REMOTE_ADDR} !^$ [OR] |
| - | RewriteCond %{HTTP:HTTP_CLIENT_IP} !^$ | + | RewriteCond %{HTTP:HTTP_CLIENT_IP} !^$ |
| - | RewriteRule ^(.*)$ - [F] | + | RewriteRule ^(.*)$ - [F] |
| Prevenir accesos al archivo .htaccess | Prevenir accesos al archivo .htaccess | ||
| # prevenir acceso .htaccess | # prevenir acceso .htaccess | ||
| - | <files .htaccess> | + | <files .htaccess> |
| - | order allow,deny | + | order allow,deny |
| - | deny from all | + | deny from all |
| - | </files> | + | </files> |
| Prevenir el acceso a un archivo específico | Prevenir el acceso a un archivo específico | ||
| - | #prevenir acceso a un fichero concreto | + | #prevenir acceso a un fichero concreto |
| - | <files nombre.jpg> | + | <files nombre.jpg> |
| - | order allow,deny | + | order allow,deny |
| - | deny from all | + | deny from all |
| - | </files> | + | </files> |
| Prevenir el acceso a varios tipos de archivos | Prevenir el acceso a varios tipos de archivos | ||
| - | # prevenir acceso a tipos de ficheros concretos | + | # prevenir acceso a tipos de ficheros concretos |
| - | <FilesMatch "\.(htaccess|htpasswd|ini|phps|log)$"> | + | <FilesMatch "\.(htaccess|htpasswd|ini|phps|log)$"> |
| - | order allow,deny | + | order allow,deny |
| - | deny from all | + | deny from all |
| - | </FilesMatch> | + | </FilesMatch> |
| Evitar que se muestren determinados tipos de ficheros | Evitar que se muestren determinados tipos de ficheros | ||
| - | # evitar muestra de fichero MP4, WMV y AVI | + | # evitar muestra de fichero MP4, WMV y AVI |
| - | IndexIgnore *.wmv *.mp4 *.avi | + | IndexIgnore *.wmv *.mp4 *.avi |
| Evitar el listado de directorios | Evitar el listado de directorios | ||
| - | # evitar listado de directorios | + | # evitar listado de directorios |
| - | IndexIgnore * | + | IndexIgnore * |
| Evitar el hotlinking en el dominio | Evitar el hotlinking en el dominio | ||
| Línea 172: | Línea 168: | ||
| El hotlinking es cuando descargan ficheros de tu servidor desde otra web para mostrarlos en ésta, 'robando' ancho de banda y servicios del tuyo. | 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 | + | # Evita el hotlinking a ficheros GIF y JPG del servidor |
| - | RewriteCond %{HTTP_REFERER} !^$ | + | RewriteCond %{HTTP_REFERER} !^$ |
| - | RewriteCond %{HTTP_REFERER} !^http://(www\.)?midominio\.com/.*$ [NC] | + | RewriteCond %{HTTP_REFERER} !^http://(www\.)?midominio\.com/.*$ [NC] |
| - | RewriteRule .*\.(gif|jpg)$ http://www.midominio.com/hotlinking.jpg [R,NC,L] | + | RewriteRule .*\.(gif|jpg)$ http://www.midominio.com/hotlinking.jpg [R,NC,L] |
| Línea 185: | Línea 181: | ||
| Para evitar el hotlinking a ficheros MP3 y ficheros de vídeo AVI, WMV y MPG: | 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 | + | # Evita el hotlinking a ficheros MP3, AVI, WMV y MPG de cualquier subdominio y dominio del servidor |
| - | RewriteCond %{HTTP_REFERER} !^$ | + | RewriteCond %{HTTP_REFERER} !^$ |
| - | RewriteCond %{HTTP_REFERER} !^http://([-a-z0-9]+\.)?midominio\.com [NC] | + | 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] | + | RewriteRule .*\.(mp3|avi|wmv|mpg|mpeg)$ http://www.midominio.com/images/nohotlink.gif [R,NC,L] |
| Línea 200: | Línea 196: | ||
| Bloqueo de robot -bot- específico, a través de SetEnvIfNoCase | Bloqueo de robot -bot- específico, a través de SetEnvIfNoCase | ||
| - | # bloqueo del bot BotMalo | + | # bloqueo del bot BotMalo |
| - | SetEnvIfNoCase User-Agent "BotMalo/" spambot | + | SetEnvIfNoCase User-Agent "BotMalo/" spambot |
| - | deny from env=spambot | + | deny from env=spambot |
| Bloque de robot -bot- específico, a través de Rewrite | Bloque de robot -bot- específico, a través de Rewrite | ||
| - | # bloqueo de 3 bots conocidos (hay muchísimos más) | + | # bloqueo de 3 bots conocidos (hay muchísimos más) |
| - | RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR] | + | RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR] |
| - | RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR] | + | RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR] |
| - | RewriteCond %{HTTP_USER_AGENT} ^Zeus | + | RewriteCond %{HTTP_USER_AGENT} ^Zeus |
| - | RewriteRule .* - [F] | + | RewriteRule .* - [F] |
| Bloqueo de robot -bot- que accede siempre al mismo fichero | Bloqueo de robot -bot- que accede siempre al mismo fichero | ||
| - | # bloqueo del bot al acceder a un fichero PHP concreto | + | # bloqueo del bot al acceder a un fichero PHP concreto |
| - | SetEnvIfNoCase Request_URI "/firefoxz.php$" spambot | + | SetEnvIfNoCase Request_URI "/firefoxz.php$" spambot |
| - | deny from env=spambot | + | deny from env=spambot |
| Bloqueo de robot -bot- que siempre es referenciado desde un mismo sitio, a través de SetEnvIfNoCase | 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 | + | # bloqueo cuando se viene referenciado de un sitio web concreto |
| - | SetEnvIfNoCase Referer "^http://www.dominiospammers.com/" spambot | + | SetEnvIfNoCase Referer "^http://www.dominiospammers.com/" spambot |
| - | deny from env=spambot | + | deny from env=spambot |
| Línea 228: | Línea 224: | ||
| Nota: Las 3 anteriores sentencias pueden combinarse escribiendo las 3 líneas SetEnvIfNoCase, y luego solo un deny, de la siguiente forma: | 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 User-Agent "BotMalo/" spambot |
| - | SetEnvIfNoCase Request_URI "/firefoxz.php$" spambot | + | SetEnvIfNoCase Request_URI "/firefoxz.php$" spambot |
| - | SetEnvIfNoCase Referer "^http://www.spammers.com/" spambot | + | SetEnvIfNoCase Referer "^http://www.spammers.com/" spambot |
| - | deny from env=spambot | + | deny from env=spambot |
| Bloqueo de robot -bot- que siempre es referenciado desde un mismo sitio, a través de Rewrite | 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 | + | # bloqueo cuando se viene referenciado de un sitio web concreto ejemplo1.com |
| - | RewriteCond %{HTTP_REFERER} ^ejemplo1\.com$ [NC] | + | RewriteCond %{HTTP_REFERER} ^ejemplo1\.com$ [NC] |
| - | RewriteRule .* - [F] | + | RewriteRule .* - [F] |
| Bloqueo de robot -bot- que siempre es referenciado desde dos sitios, a través de Rewrite | 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 | + | # bloqueo cuando se viene referenciado desde ejemplo1.com o ejemplo2.com |
| - | RewriteCond %{HTTP_REFERER} ^ejemplo1\.com$ [NC,OR] | + | RewriteCond %{HTTP_REFERER} ^ejemplo1\.com$ [NC,OR] |
| - | RewriteCond %{HTTP_REFERER} ^ejemplo2\.com$ [NC] | + | RewriteCond %{HTTP_REFERER} ^ejemplo2\.com$ [NC] |
| - | RewriteRule .* - [F] | + | RewriteRule .* - [F] |
| Evitar acceso mediante el navegador a una carpeta sin el archivo "index" | Evitar acceso mediante el navegador a una carpeta sin el archivo "index" | ||
| - | # evitar acceso a carpeta sin index | + | # evitar acceso a carpeta sin index |
| - | Options All -Indexes | + | Options All -Indexes |
| Línea 255: | Línea 251: | ||
| Nota: lo contrario, es decir, permitir el acceso a carpetas sin index es: | Nota: lo contrario, es decir, permitir el acceso a carpetas sin index es: | ||
| - | # evitar acceso a carpeta sin index | + | # evitar acceso a carpeta sin index |
| - | Options All +Indexes | + | Options All +Indexes |
| Línea 263: | Línea 259: | ||
| - | 3.- Re-escritura y redirección | + | ====== 3.- Re-escritura y redirección ====== |
| + | |||
| Quitar siempre las www de la URL | Quitar siempre las www de la URL | ||
| Línea 269: | Línea 267: | ||
| Es importante no repetir URLs -mostrando el mismo contenido con y sin www-, ya que penaliza el posicionamiento. | Es importante no repetir URLs -mostrando el mismo contenido con y sin www-, ya que penaliza el posicionamiento. | ||
| - | # quitar las www | + | # quitar las www |
| - | RewriteCond %{http_host} ^www\.netandsoftware\.com [NC] | + | RewriteCond %{http_host} ^www\.netandsoftware\.com [NC] |
| - | RewriteRule ^(.*)$ http://netandsoftware.com/$1 [R=301,L] | + | RewriteRule ^(.*)$ http://netandsoftware.com/$1 [R=301,L] |
| Mostrar siempre las www de la URL | Mostrar siempre las www de la URL | ||
| - | # mostrar siempre las www | + | # mostrar siempre las www |
| - | RewriteCond %{HTTP_HOST} . | + | RewriteCond %{HTTP_HOST} . |
| - | RewriteCond %{HTTP_HOST} !^www\.netandsoftware\.com$ | + | RewriteCond %{HTTP_HOST} !^www\.netandsoftware\.com$ |
| - | RewriteRule (.*) http://www.netandsoftware.com/$1 [R=301,L] | + | RewriteRule (.*) http://www.netandsoftware.com/$1 [R=301,L] |
| Cambiar la página de carga por defecto | Cambiar la página de carga por defecto | ||
| - | #orden de los ficheros de carga por defecto | + | #orden de los ficheros de carga por defecto |
| - | DirectoryIndex inicio.html index.htm index.html index.php | + | DirectoryIndex inicio.html index.htm index.html index.php |
| Línea 293: | Línea 291: | ||
| Esto se hace para que sea más dificil detectar el tipo de ficheros que se usa | Esto se hace para que sea más dificil detectar el tipo de ficheros que se usa | ||
| - | # camuflar archivos PHP como NAS | + | # camuflar archivos PHP como NAS |
| - | AddType application/x-httpd-php .nas | + | AddType application/x-httpd-php .nas |
| Redirigir el contenido en función del navegador usado | Redirigir el contenido en función del navegador usado | ||
| - | RewriteCond %{HTTP_USER_AGENT} ^Opera/* | + | RewriteCond %{HTTP_USER_AGENT} ^Opera/* |
| - | RewriteRule ^index\.html$ index.opera.html [L] | + | RewriteRule ^index\.html$ index.opera.html [L] |
| - | RewriteCond %{HTTP_USER_AGENT} ^Mozilla/* | + | RewriteCond %{HTTP_USER_AGENT} ^Mozilla/* |
| - | RewriteRule ^index\.html$ index.mozilla.html [L] | + | RewriteRule ^index\.html$ index.mozilla.html [L] |
| - | RewriteRule ^index\.html$ index.html [L] | + | RewriteRule ^index\.html$ index.html [L] |
| Línea 310: | Línea 308: | ||
| Redireccionar una antigua página a la nueva | Redireccionar una antigua página a la nueva | ||
| - | # redireccionar permanentemente | + | # redireccionar permanentemente |
| - | RewriteRule ^(.*)$ http://www.minuevodominio.com/$1 [R=301,L] | + | RewriteRule ^(.*)$ http://www.minuevodominio.com/$1 [R=301,L] |
| Redireccionar una antigua página a la nueva, a través de ReDirect | Redireccionar una antigua página a la nueva, a través de ReDirect | ||
| - | # redireccionar permanentemente | + | # redireccionar permanentemente |
| - | redirect 301 / http://www.dominio.com/ | + | redirect 301 / http://www.dominio.com/ |
| Redireccionar una web a otro sitio provisionalmente (redirección 302) | Redireccionar una web a otro sitio provisionalmente (redirección 302) | ||
| - | # redireccionar provisionalmente | + | # redireccionar provisionalmente |
| - | RewriteRule ^(.*)$ http://www.minuevodominio.com/$1 [R=302,L] | + | RewriteRule ^(.*)$ http://www.minuevodominio.com/$1 [R=302,L] |
| Redireccionar de un archivo a otro | Redireccionar de un archivo a otro | ||
| - | # redireccionar un antiguo fichero a otra nueva dirección | + | # redireccionar un antiguo fichero a otra nueva dirección |
| - | Redirect /antiguo.html http://dominio.com/nuevo.html | + | Redirect /antiguo.html http://dominio.com/nuevo.html |
| Redireccionar una IP concreta a una página concreta | Redireccionar una IP concreta a una página concreta | ||
| Línea 333: | Línea 331: | ||
| # redireccionar una IP a una página concreta de nuestra web | # redireccionar una IP a una página concreta de nuestra web | ||
| - | RewriteCond %{REMOTE_ADDR} 100.101.102.103 | + | RewriteCond %{REMOTE_ADDR} 100.101.102.103 |
| - | RewriteRule .* pagina-concreta.html [R] | + | RewriteRule .* pagina-concreta.html [R] |
| Redireccionar toda una web a un directorio del mismo dominio | Redireccionar toda una web a un directorio del mismo dominio | ||
| - | # traslada todas las URL antiguas a la nueva carpeta en el mismo dominio | + | # traslada todas las URL antiguas a la nueva carpeta en el mismo dominio |
| - | RewriteCond %{HTTP_HOST} ^midominio\.com$ [OR] | + | RewriteCond %{HTTP_HOST} ^midominio\.com$ [OR] |
| - | RewriteCond %{HTTP_HOST} ^www\.midominio\.com$ | + | RewriteCond %{HTTP_HOST} ^www\.midominio\.com$ |
| - | RewriteCond %{REQUEST_URI} !^/webencarpeta/ | + | RewriteCond %{REQUEST_URI} !^/webencarpeta/ |
| - | RewriteRule (.*) /webencarpeta/$1 [L] | + | RewriteRule (.*) /webencarpeta/$1 [L] |
| Quitar una palabra de una URL | Quitar una palabra de una URL | ||
| Línea 348: | Línea 346: | ||
| En el siguiente ejemplo, de http://www.midominio.com/quitar/prueba.html a http://www.midominio.com/prueba.html | En el siguiente ejemplo, de http://www.midominio.com/quitar/prueba.html a http://www.midominio.com/prueba.html | ||
| - | # quitar una cadena de una URL | + | # quitar una cadena de una URL |
| - | RewriteRule ^quitar/(.+)$ http://www.midominio.com/$1 [R=301,L] | + | RewriteRule ^quitar/(.+)$ http://www.midominio.com/$1 [R=301,L] |
| URL amigable (uso de fin de interrogación en RewriteRule) | URL amigable (uso de fin de interrogación en RewriteRule) | ||
| Línea 355: | Línea 353: | ||
| Cambia una URL como http://www.midominio.com/articulos-blog?catid=27 a http://www.midominio.com/articulos-blog de forma permanente. | Cambia una URL como http://www.midominio.com/articulos-blog?catid=27 a http://www.midominio.com/articulos-blog de forma permanente. | ||
| - | # Uso de ? | + | # Uso de ? |
| - | RewriteCond %{REQUEST_URI} ^/articulos-blog$ [NC] | + | RewriteCond %{REQUEST_URI} ^/articulos-blog$ [NC] |
| - | RewriteCond %{QUERY_STRING} ^catid=(.*)$ [NC] | + | RewriteCond %{QUERY_STRING} ^catid=(.*)$ [NC] |
| - | RewriteRule ^(.*)$ /articulos-blog? [R=301,L] | + | RewriteRule ^(.*)$ /articulos-blog? [R=301,L] |
| URL amigable (uso del tanto por ciento en RewriteRule) | 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. | Cambia una URL como http://www.dominio.com/noticias?id=127 a http://www.dominio.com/noticias/127 de forma provisional. | ||
| - | # Uso del % | + | # Uso del % |
| - | RewriteCond %{REQUEST_URI} ^/noticias$ [NC] | + | RewriteCond %{REQUEST_URI} ^/noticias$ [NC] |
| - | RewriteCond %{QUERY_STRING} ^id=(.*)$ [NC] | + | RewriteCond %{QUERY_STRING} ^id=(.*)$ [NC] |
| - | RewriteRule ^(.*)$ /noticias/%1? [R=302,L] | + | RewriteRule ^(.*)$ /noticias/%1? [R=302,L] |
| Mejorando el posicionamiento SEO con RewriteRule | 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. | 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 | + | # mejorando el posicionamiento SEO sustituyendo caracteres sin sentido por otros que determinan el contenido |
| - | RewriteRule ^(.*)/ps/(.*)$ $1/posicionamiento-seo/$2 [L,R=301] | + | RewriteRule ^(.*)/ps/(.*)$ $1/posicionamiento-seo/$2 [L,R=301] |
| Transformación de una URL con agrupamiento de caracteres mayúsculas y minúsculas | Transformación de una URL con agrupamiento de caracteres mayúsculas y minúsculas | ||
| Línea 378: | Línea 376: | ||
| Cambia la URL de este tipo http://www.midominio.com/pais/Espana.php a http://www.midominio.com/codigo/pais.php?nombre=Espana | 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 | + | # detectar palabras en mayúsculas o minúsculas o combinacion de ambas |
| - | RewriteRule ^pais/([a-zA-Z_-]+).php$ codigo/pais.php?nombre=$1 [L] | + | RewriteRule ^pais/([a-zA-Z_-]+).php$ codigo/pais.php?nombre=$1 [L] |
| Paso de parámetros en la URL y doble parámetro | Paso de parámetros en la URL y doble parámetro | ||
| Línea 385: | Línea 383: | ||
| 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 | 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 | + | # Doble parámetro |
| - | RewriteRule ^fecha/(.+)/(.+)\.html$ fecha.php?mes=$2&anio=$1 [R=301,L] | + | RewriteRule ^fecha/(.+)/(.+)\.html$ fecha.php?mes=$2&anio=$1 [R=301,L] |
| Línea 393: | Línea 391: | ||
| - | 4.- Compresión y caché | + | ====== 4.- Compresión y caché ====== |
| Comprimir ficheros de texto, HTML, JavaScript, CSS y XML | Comprimir ficheros de texto, HTML, JavaScript, CSS y XML | ||
| - | # comprimir focheros texto, html, javascript, css, xml | + | # comprimir focheros texto, html, javascript, css, xml |
| - | AddOutputFilterByType DEFLATE text/plain | + | AddOutputFilterByType DEFLATE text/plain |
| - | AddOutputFilterByType DEFLATE text/html | + | AddOutputFilterByType DEFLATE text/html |
| - | AddOutputFilterByType DEFLATE text/xml | + | AddOutputFilterByType DEFLATE text/xml |
| - | AddOutputFilterByType DEFLATE text/css | + | AddOutputFilterByType DEFLATE text/css |
| - | AddOutputFilterByType DEFLATE application/xml | + | AddOutputFilterByType DEFLATE application/xml |
| - | AddOutputFilterByType DEFLATE application/xhtml+xml | + | AddOutputFilterByType DEFLATE application/xhtml+xml |
| - | AddOutputFilterByType DEFLATE application/rss+xml | + | AddOutputFilterByType DEFLATE application/rss+xml |
| - | AddOutputFilterByType DEFLATE application/javascript | + | AddOutputFilterByType DEFLATE application/javascript |
| - | AddOutputFilterByType DEFLATE application/x-javascript | + | AddOutputFilterByType DEFLATE application/x-javascript |
| Línea 415: | Línea 414: | ||
| Cachear ficheros de imágenes a una semana | Cachear ficheros de imágenes a una semana | ||
| - | #Cache del navegador, imagenes cacheadas a una semana: 604800 segundos | + | #Cache del navegador, imagenes cacheadas a una semana: 604800 segundos |
| - | <FilesMatch "\.(ico|jpg|jpeg|png|gif)$"> | + | <FilesMatch "\.(ico|jpg|jpeg|png|gif)$"> |
| - | Header set Cache-Control "max-age=604800, public" | + | Header set Cache-Control "max-age=604800, public" |
| - | </FilesMatch> | + | </FilesMatch> |
| Cachear ficheros JPG a un mes | Cachear ficheros JPG a un mes | ||
| - | #Cache del navegador, imágenes cacheadas a un mes: 2592000 segundos | + | #Cache del navegador, imágenes cacheadas a un mes: 2592000 segundos |
| - | <FilesMatch "\.(jpg|jpeg)$"> | + | <FilesMatch "\.(jpg|jpeg)$"> |
| - | Header set Cache-Control "max-age=2592000, public" | + | Header set Cache-Control "max-age=2592000, public" |
| - | </FilesMatch> | + | </FilesMatch> |
| Cachear con ExpiresByType y el intervalo legible | 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 | + | #caché que expira las imágenes JPG en 6 meses, los CSS en 2 meses, y los JavaScripts en 2 semanas |
| - | ExpiresActive on | + | ExpiresActive on |
| - | ExpiresByType image/jpg "access plus 6 months" | + | ExpiresByType image/jpg "access plus 6 months" |
| - | ExpiresByType text/css "access plus 2 months" | + | ExpiresByType text/css "access plus 2 months" |
| - | ExpiresByType text/javascript "access plus 2 weeks" | + | ExpiresByType text/javascript "access plus 2 weeks" |
| Cachear ficheros a un año con ExpiresDefault y el intervalo en segundos | Cachear ficheros a un año con ExpiresDefault y el intervalo en segundos | ||
| - | ExpiresActive On | + | ExpiresActive On |
| - | ExpiresDefault A0 | + | ExpiresDefault A0 |
| - | # caché expira en un año (A9030400) para los ficheros FLV, ICO, AVI, MOV, PPT, DOC, MP3, WMV y WAV | + | # 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)$"> | + | <FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$"> |
| - | ExpiresDefault A9030400 | + | ExpiresDefault A9030400 |
| - | </FilesMatch> | + | </FilesMatch> |
| Línea 449: | Línea 448: | ||
| - | 5.- Otros funcionalidades en el .htaccess | + | ====== 5.- Otros funcionalidades en el .htaccess ====== |
| Asignar permisos CHMOD automáticamente al fichero .htpasswd | Asignar permisos CHMOD automáticamente al fichero .htpasswd | ||
| - | # permiso automático del fichero que protege el directorio .htpasswd | + | # permiso automático del fichero que protege el directorio .htpasswd |
| - | chmod .htpasswd files 640 | + | chmod .htpasswd files 640 |
| Asignar permisos CHMOD automáticamente al fichero .htaccess | Asignar permisos CHMOD automáticamente al fichero .htaccess | ||
| - | # permiso automático del fichero .htaccess | + | # permiso automático del fichero .htaccess |
| - | chmod .htaccess files 644 | + | chmod .htaccess files 644 |
| Asignar permisos CHMOD automáticamente a ficheros PHP | Asignar permisos CHMOD automáticamente a ficheros PHP | ||
| - | # permisos automáticos de archivos PHP | + | # permisos automáticos de archivos PHP |
| - | chmod php files 600 | + | chmod php files 600 |
| Limitar la subida de ficheros más grandes que una cantidad | Limitar la subida de ficheros más grandes que una cantidad | ||
| Línea 470: | Línea 470: | ||
| Protege de ciertos ataques DOS, limitando el tamaño de archivos que se suben al servidor. | Protege de ciertos ataques DOS, limitando el tamaño de archivos que se suben al servidor. | ||
| - | # limitar la subida a 10 MB | + | # limitar la subida a 10 MB |
| - | LimitRequestBody 10000000 | + | LimitRequestBody 10000000 |
| Permitir al usuario descargar archivos multimedia | Permitir al usuario descargar archivos multimedia | ||
| Línea 477: | Línea 477: | ||
| Generalmente sólo se permiten abrir | Generalmente sólo se permiten abrir | ||
| - | # permitir descarga de ficheros multimedia AVI, MPG, WMV y MP3 | + | # permitir descarga de ficheros multimedia AVI, MPG, WMV y MP3 |
| - | AddType application/octet-stream .avi | + | AddType application/octet-stream .avi |
| - | AddType application/octet-stream .mpg | + | AddType application/octet-stream .mpg |
| - | AddType application/octet-stream .wmv | + | AddType application/octet-stream .wmv |
| - | AddType application/octet-stream .mp3 | + | AddType application/octet-stream .mp3 |
| Personalizar errores 404 | Personalizar errores 404 | ||
| - | ErrorDocument 404 /errores/404.html | + | ErrorDocument 404 /errores/404.html |
| Línea 493: | Línea 493: | ||
| Corregir pequeños errores de ortografía en las URL | Corregir pequeños errores de ortografía en las URL | ||
| - | CheckSpelling On | + | CheckSpelling On |
| Especificar el e-mail por defecto del administrador del servidor | Especificar el e-mail por defecto del administrador del servidor | ||
| - | # e-mail del administrador del servidor | + | # e-mail del administrador del servidor |
| - | SetEnv SERVER_ADMIN webmaster@midominio.com | + | SetEnv SERVER_ADMIN webmaster@midominio.com |
| Especificar el lenguaje por defecto del servidor | Especificar el lenguaje por defecto del servidor | ||
| - | # lenguaje por defecto del servidor | + | # lenguaje por defecto del servidor |
| - | DefaultLanguage en-US | + | DefaultLanguage en-US |
| Forzar el uso del protocolo seguro SSL | Forzar el uso del protocolo seguro SSL | ||
| - | # fuerza el uso de SSL en la web | + | # fuerza el uso de SSL en la web |
| - | SSLOptions + StrictRequire | + | SSLOptions + StrictRequire |
| - | SSLRequireSSL | + | SSLRequireSSL |
| Redireccionar usuarios con protocolo seguro HTTPS a una carpeta en particular | 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 | Esto se puede necesitar cuando una web tiene una tienda online en una carpeta específica | ||
| - | RewriteCond %{SERVER_PORT} 80 | + | RewriteCond %{SERVER_PORT} 80 |
| - | RewriteCond %{REQUEST_URI} carpeta | + | RewriteCond %{REQUEST_URI} carpeta |
| - | RewriteRule ^(.*)$ https://www.midominio.com/carpeta/$1 [R,L] | + | RewriteRule ^(.*)$ https://www.midominio.com/carpeta/$1 [R,L] |
| Evitar la visualización de errores al visitante | Evitar la visualización de errores al visitante | ||
| - | # evitar que los errores se muestren al usuario | + | # evitar que los errores se muestren al usuario |
| - | php_flag display_startup_errors off | + | php_flag display_startup_errors off |
| - | php_flag display_errors off | + | php_flag display_errors off |
| - | php_flag html_errors off | + | php_flag html_errors off |
| Registrar errores de PHP en un fichero log | Registrar errores de PHP en un fichero log | ||
| - | # registrar errores en log | + | # registrar errores en log |
| - | php_flag log_errors on | + | php_flag log_errors on |
| - | php_value error_log /logs/php_error.log | + | 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 al mismo tiempo a 400 | ||
| - | # limitar el número de visitas a 400 | + | # limitar el número de visitas a 400 |
| - | MaxClients 400 | + | MaxClients 400 |
| Denegar la ejecución de scripts CGI | Denegar la ejecución de scripts CGI | ||
| - | # bloquear CGIs | + | # bloquear CGIs |
| - | Options -ExecCGI | + | Options -ExecCGI |
| - | AddHandler cgi-script .php .pl .py .jsp .asp .sh .cgi | + | AddHandler cgi-script .php .pl .py .jsp .asp .sh .cgi |
| Declarar tipos MIME | Declarar tipos MIME | ||
| - | # agregar tipos mime | + | # agregar tipos mime |
| - | AddType application/x-shockwave-flash .swf | + | AddType application/x-shockwave-flash .swf |
| - | AddType video/x-flv .flv | + | AddType video/x-flv .flv |
| - | AddType image/x-icon .ico | + | AddType image/x-icon .ico |
| Definiendo el juego de caracteres | Definiendo el juego de caracteres | ||
| Línea 553: | Línea 553: | ||
| Pasando el juego de caracteres se evita el mostrar un error 500 por este motivo | Pasando el juego de caracteres se evita el mostrar un error 500 por este motivo | ||
| - | AddDefaultCharset utf-8 | + | AddDefaultCharset utf-8 |
| Desactivar los Entities Tags | Desactivar los Entities Tags | ||
| - | FileETag none | + | FileETag none |
| Línea 564: | Línea 564: | ||
| - | 6.- Recomendaciones sobre el fichero .htaccess | + | ====== 6.- Recomendaciones sobre el fichero .htaccess ====== |
| - | 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. | + | |
| - | 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. | + | 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. |
| - | 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. | + | |
| - | Protege adecuadamente este archivo de reescrituras ajenas, puede llegar a ser muy peligroso. | + | 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. |
| - | La denegación de permisos debe estar lo primero, antes de ejecutar RewriteCond y RewriteRule. | + | 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. |
| + | Protege adecuadamente este archivo de reescrituras ajenas, puede llegar a ser muy peligroso. | ||
| + | |||
| + | La denegación de permisos debe estar lo primero, antes de ejecutar RewriteCond y RewriteRule. | ||
| - | 7.- Simbología del fichero .htaccess | + | ====== 7.- Simbología del fichero .htaccess ====== |
| De forma breve, los códigos y símbolos en el archivo .htaccess son: | De forma breve, los códigos y símbolos en el archivo .htaccess son: | ||
| Línea 599: | Línea 603: | ||
| [PT] Pass Through: pasa el URL a Apache para seguir procesando. | [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. | + | [OR] Or: indica que la expresión debe interpretase como una alternativa junto a la siguiente: o 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. | [NE] No Escape: analiza las salidas de caracteres sin escapar. | ||
| Línea 655: | Línea 659: | ||
| + indica uno o más caracteres del caracter que le precede. Por ejemplo: (.+) indica cualquier cadena de uno o más caracteres. | + 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. | + | ''|'' 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. | \ 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. | ||
| Línea 685: | Línea 689: | ||
| - | Y espero que con estos ejemplos, tengan resueltas muchas de las opciones posibles para configurar su propio .htaccess según sus necesidades. | + | |