<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>tail -f &#124; sysadmin &#187; .htaccess</title>
	<atom:link href="http://www.tail-f.com.ar/tag/htaccess/feed" rel="self" type="application/rss+xml" />
	<link>http://www.tail-f.com.ar</link>
	<description>Noticias y recursos para sysadmins Unix</description>
	<lastBuildDate>Mon, 28 Nov 2011 21:44:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Prevenir hotlinking con .htaccess en Apache</title>
		<link>http://www.tail-f.com.ar/servicios/httpd/apache-httpd-servicios/prevenir-hotlinking-con-htaccess-en-apache.html</link>
		<comments>http://www.tail-f.com.ar/servicios/httpd/apache-httpd-servicios/prevenir-hotlinking-con-htaccess-en-apache.html#comments</comments>
		<pubDate>Tue, 30 Dec 2008 23:21:16 +0000</pubDate>
		<dc:creator>elbarto</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[hotlinking]]></category>
		<category><![CDATA[optimización]]></category>

		<guid isPermaLink="false">http://www.tail-f.com.ar/?p=147</guid>
		<description><![CDATA[El hotlinking (también conocido como inline linking y por otros varios sinónimos) es el uso de una imagen alojada en un sitio A para ser mostrada en un sitio B. Por ejemplo, yo podría en este blog incluir una imagen del sitio de Dataweb Hosting, pero en vez de descargarla y subirla a mi servidor, [...]]]></description>
			<content:encoded><![CDATA[<p>El <a href="http://en.wikipedia.org/wiki/Hotlinking">hotlinking</a> (también conocido como inline linking y por otros varios sinónimos) es el uso de una imagen alojada en un sitio A para ser mostrada en un sitio B. Por ejemplo, yo podría en este blog incluir una imagen del sitio de <a href="http://www.datawebhosting.com.ar">Dataweb Hosting</a>, pero en vez de descargarla y subirla a mi servidor, poner directamente el link a la imagen en el servidor de Dataweb, por ejemplo:</p>
<pre>&lt;img src="http://www.datawebhosting.com.ar/img/logo_dataweb_hosting.jpg"&gt;</pre>
<p>Entonces, cuando alguien entre al blog, el browser automáticametne va a ir a buscar esa imagen al servidor de Dataweb. Esto es algo absolutamente &#8220;legal&#8221; y es de gran ayuda en muchos casos. De hecho, esto mismo se puede hacer con cualquier archivo que uno incluya en un sitio web (una imagen, un video, un script de Javascript, una hoja de estilos CSS, etc.). Esto nos permite, por ejemplo, incluir en nuestros sitios videos de YouTube, los scripts de publicidad de Google AdSense, etc.</p>
<div id="attachment_37" class="wp-caption alignright" style="width: 310px"><a href="http://www.tail-f.com.ar/wp-content/uploads/apache1.gif"><img class="size-medium wp-image-37" title="apache1" src="http://www.tail-f.com.ar/wp-content/uploads/apache1-300x300.gif" alt="Apache Web Server" width="300" height="300" /></a><p class="wp-caption-text">Apache Web Server</p></div>
<p>Por supuesto, al incluir un recurso de esta forma, se genera tráfico en el servidor de orígen. En algunos casos puede ser un problema, porque si yo tengo alojado mi sitio en un servidor chico y una persona publica una imagen de mi servidor en un sitio muy concurrido, mi tráfico se puede incrementar a niveles que quizás no sea capaz de manejar. En ese momento el hotlinking resulta nocivo.</p>
<p>Afortunadamente, Apache tiene muchos features interesantes y jugando un poco con <a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html">mod_rewrite</a> podemos evitar el hotlinking. Para ello debemos tener en cuenta que los requests de estas imágenes van a llevar siempre un HTTP Referer que va a ser igual a la URL donde éstas están incluidas. En el ejemplo anterior, al servidor de Dataweb le llegaría un request del archivo logo_dataweb_hosting.jpg con un referer que podría ser &#8220;http://www.tail-f.com.ar/&#8221;. Entonces, en nuestro archivo .htaccess hacemos lo siguiente:</p>
<pre>RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mysite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]</pre>
<p>En este caso, cuando venga un request que tenga como referer una URL de un dominio diferente al mío (específicamente diferente de mi dominio principal y cualquier subdominio), que sea de un archivo con extensión jpeg, jpg, gif, bmp o png, se devolverá la imágen &#8220;nohotlink.jpg&#8221;.</p>
<p>Otra opción es bloquear el hotlinking por parte de dominios específicos. Por ejemplo:</p>
<pre>RewriteEngine On
RewriteCond %{HTTP_REFERER} ^http://(.+\.)?myspace\.com/ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http://(.+\.)?blogspot\.com/ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http://(.+\.)?livejournal\.com/ [NC]
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]</pre>
<p>En este caso, similar al anterior, lo que se bloquean son todos los requests que vengan de <a href="http://myspace.com">myspace.com</a>, <a href="http://blogspot.com">blogspot.com</a> y <a href="http://livejournal.com">livejournal.com</a>.</p>
<p>Para cerrar debo decir que no estoy muy de acuerdo con estos métodos por una serie de razones. En primer lugar, por una cuestión de principios, siempre prefiero compartir mis imágenes (así como espero que los demás las compartan conmigo) a prohibir su uso. En segundo lugar, y más importante, este método dista mucho de ser ideal. De hecho, aunque usándolo el hotlinking resulte inútil para la persona del otro sitio que quiera usar nuestras imágenes, no dejamos de transferir la imagen nohotlink.jpg. Con lo cual, aunque se pudiera reducir el tráfico (suponemos que nohotlink.jpg sería una imagen muy liviana), no se reduciría la cantidad de requests que de por sí pueden resultar muy pesados para el servidor.</p>
<p>Una opción más interesante, porque evita transferir una imágen, es devolver un código de error HTTP, por ejemplo 403 (Forbidden). Para ello, en el código anterior reemplazaríamos:</p>
<pre>RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]</pre>
<p>por</p>
<pre>RewriteRule .*\.(jpe?g|gif|bmp|png)$ - [F]</pre>
<p>Sin embargo, me pareció un ejemplo interesante para publicar porque da más ideas sobre cómo usar <a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html">mod_rewrite</a> y puede aportar en la solución creativa de problemas similares.</p>
<p>Fuente: <a href="http://altlab.com/htaccess_tutorial.html">altlab.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tail-f.com.ar/servicios/httpd/apache-httpd-servicios/prevenir-hotlinking-con-htaccess-en-apache.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Reduciendo el tráfico usando cache en Apache</title>
		<link>http://www.tail-f.com.ar/servicios/httpd/apache-httpd-servicios/reduciendo-el-trafico-usando-cache-en-apache.html</link>
		<comments>http://www.tail-f.com.ar/servicios/httpd/apache-httpd-servicios/reduciendo-el-trafico-usando-cache-en-apache.html#comments</comments>
		<pubDate>Sun, 23 Nov 2008 02:52:13 +0000</pubDate>
		<dc:creator>elbarto</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[mod_expires]]></category>
		<category><![CDATA[mod_headers]]></category>

		<guid isPermaLink="false">http://www.tail-f.com.ar/?p=35</guid>
		<description><![CDATA[Todos sabemos que en servidores de alta concurrencia el tema del tráfico es crítico. Reducir la cantidad de requests (pedidos) HTTP que hacen los clientes de un sitio muy visitado resulta clave para optimizar el rendimiento de nuestro servidor. Cada pedido implica una cantidad de ancho de banda que se consume (el pedido que va [...]]]></description>
			<content:encoded><![CDATA[<p>Todos sabemos que en servidores de alta concurrencia el tema del tráfico es crítico. Reducir la cantidad de requests (pedidos) HTTP que hacen los clientes de un sitio muy visitado resulta clave para optimizar el rendimiento de nuestro servidor. Cada pedido implica una cantidad de ancho de banda que se consume (el pedido que va y la respuesta que vuelve) y procesamiento del lado del servidor y del cliente. Si logramos reducir la cantidad de los requests vamos a estar aliviando tanto el ancho de banda como la carga del servidor, con lo cual, vamos a poder atender a mayor cantidad de clientes con los mismos recursos.</p>
<div id="attachment_37" class="wp-caption alignright" style="width: 310px"><a href="http://www.tail-f.com.ar/wp-content/uploads/apache1.gif"><img class="size-medium wp-image-37" title="apache1" src="http://www.tail-f.com.ar/wp-content/uploads/apache1-300x300.gif" alt="Apache Web Server" width="300" height="300" /></a><p class="wp-caption-text">Apache Web Server</p></div>
<p>Hay muchos aspectos en el diseño de la arquitectura de una aplicación que deben ser tenidos en cuenta para reducir la cantidad de requests. No podemos cubrir todos aquí, pero uno fundamental es el <em>cache</em>. El cache es, por lo general, una reproducción estática de un conjunto de información dinámica. Es decir, un almacenamiento temporal de una información que puede cambiar, durante un período de tiempo en el que se supone que no ha de hacerlo.</p>
<p>Por ejemplo, si yo tengo un conjunto grande de datos sobre los ingresos de los miembros de una familia y debo mostrar informes realizados sobre esos datos, tendría que hacer toda una serie de cálculos que mes a mes irían dando resultados distintos. Si yo sé que a lo largo de un mes, los datos de orígen no van a cambiar, puedo hacer un cache (una copia de los resultados ya calculados) para mostrarlos durante todo ese mes y no volver a hacer los cálculos.</p>
<p>Hay varios tipos de cache, que se pueden implementar en distintos segmentos de la arquitectura de una aplicación. En este caso nos ocuparemos del cache que se hace en el cliente HTTP (el browser) para evitar hacer consultas innecesarias al servidor (el Apache), con los beneficios que mencionamos más arriba.</p>
<p>Cuando cualquiera de nosotros visita un sitio web con un browser común, éste último se ocupa de hacer un request HTTP al servidor pidiendo el contenido de la URL que solicitamos (por ejemplo, el contenido del archivo <a href="http://www.tail-f.com.ar/index.php">http://www.tail-f.com.ar/index.php</a>). Ahora bien, cuando recibe el contenido del archivo, si es HTML, es muy probable que éste incluya referencias a toda otra serie de archivos (imágenes, archivos de CSS, archivos de JavaScript, etc.). Automáticamente, y en forma totalmente transparente para nosotros, el browser va a hacer los requests de esos archivos, para bajar las imágenes y archivos que necesite para mostrarnos la página web a la que nosotros queremos acceder. Pero ¿qué sucede?, muchos de estos archivos, especialmente las imágenes, lo más probable es que no cambien casi nunca. El logo de la empresa dueña del sitio seguirá siendo el mismo y si yo actualizo la página o voy de la home a la sección de contacto, el logo que aparece en el encabezado se estaría descargando muchas veces. La gente que definió el protocolo HTTP ya tenía en mente este tipo de situaciones, entonces definió una serie de directivas que se envían en los headers de los mensajes HTTP, a través de las cuales el servidor le puede indicar al cliente si debe guardar ese archivo y por cuánto tiempo. De esta manera, al visitar la home del sitio por primera vez, el servidor puede decirme &#8220;este logo va a permanecer igual por todo un mes, así que guardalo y no me lo vuelvas a pedir hasta entonces&#8221;, y si yo soy obediente, lo haré, y nos haré un favor a los dos. Porque la próxima vez que vea que un HTML de este sitio me indica que tengo que poner la imagen logo.jpg en algún lado, la buscaré en mi disco rígido en vez de pedírsela al servidor, pudiendo mostrarla mucho más rápido al visitante.</p>
<p><strong>¿Cómo se configura esto en Apache?</strong></p>
<p>Hay dos módulos de Apache que nos servirán en este punto:</p>
<ul>
<li><a href="http://httpd.apache.org/docs/2.0/mod/mod_headers.html">mod_headers</a></li>
<li><a href="http://httpd.apache.org/docs/2.0/mod/mod_expires.html">mod_expires</a></li>
</ul>
<p>El primero permite manipular los headers (cabeceras) de los requests y responses que envía Apache. El segundo sirve para control uno de esos headers en particular, que es justamente el llamado &#8220;Expires&#8221;, que define el tiempo de expiración del archivo que se está mandando en un response.</p>
<p>Por lo tanto, aplicando unas reglas con expresiones regulares y estos dos módulos, en el <a href="http://httpd.apache.org/docs/2.0/configuring.html">httpd.conf</a> de Apache o en un <a href="http://httpd.apache.org/docs/2.0/howto/htaccess.html">.htaccess</a>, podemos definir cómo será el tratamiento de distintos tipos de archivos.</p>
<p>Por una cuestión de simplicidad yo lo he probado con un .htaccess, pero usarlo en el httpd.conf resultaría más óptimo aún, porque el procesamiento del .htaccess de por sí le quita rendimiento a Apache.</p>
<p>A continuación, dejo un ejemplo de configuración de un .htaccess en el cual se define que los archivos multimedia (sonido y video) deberán ser cacheados por un año, las imágenes por una semana, los archivos estáticos más comunes (html, css, js) cada 2 horas y los archivos dinámicos (php, cgi, pl) no deberán tener cache.</p>
<pre># Turn on Expires and set default to 0
ExpiresActive On
ExpiresDefault A0

# Set up caching on media files for 1 year (forever?)
&lt;FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$"&gt;
ExpiresDefault A29030400
Header append Cache-Control "public"
&lt;/FilesMatch&gt;

# Set up caching on media files for 1 week
&lt;FilesMatch "\.(gif|jpg|jpeg|png|swf)$"&gt;
ExpiresDefault A604800
Header append Cache-Control "public"
&lt;/FilesMatch&gt;

# Set up 2 Hour caching on commonly updated files
&lt;FilesMatch "\.(xml|txt|html|js|css)$"&gt;
ExpiresDefault A7200
Header append Cache-Control "proxy-revalidate"
&lt;/FilesMatch&gt;

# Force no caching for dynamic files
&lt;FilesMatch "\.(php|cgi|pl|htm)$"&gt;
ExpiresActive Off
Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
Header set Pragma "no-cache"
&lt;/FilesMatch&gt;</pre>
<p>Fuente del código: <a href="http://www.askapache.com/htaccess/speed-up-your-site-with-caching-and-cache-control.html#caching-with-both-modules">AskApache.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tail-f.com.ar/servicios/httpd/apache-httpd-servicios/reduciendo-el-trafico-usando-cache-en-apache.html/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

