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

<channel>
	<title>Maestros del Web &#187; William Wong Garay</title>
	<atom:link href="http://www.maestrosdelweb.com/author/william-wong/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.maestrosdelweb.com</link>
	<description>Un espacio para los entusiastas del web</description>
	<pubDate>Fri, 03 Oct 2008 15:03:43 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Modificando el comportamiento de fieldWithErrors en Rails</title>
		<link>http://www.maestrosdelweb.com/editorial/modificando-el-comportamiento-de-fieldwitherrors-en-rails/</link>
		<comments>http://www.maestrosdelweb.com/editorial/modificando-el-comportamiento-de-fieldwitherrors-en-rails/#comments</comments>
		<pubDate>Fri, 06 Jul 2007 07:00:37 +0000</pubDate>
		<dc:creator>William Wong Garay</dc:creator>
		
		<category><![CDATA[Editorial]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.maestrosdelweb.com/editorial/modificando-el-comportamiento-de-fieldwitherrors-en-rails/</guid>
		<description><![CDATA[En el siguiente artículo encontrarás la solución a la devolución de errores que etiquetan los campos de datos con un DIV utilizando la clase fieldWithErrors en Rails en el diseño de formularios.
Una de las cosas que más me molestaba de trabajar con formularios en Rails era la devolución de errores que etiquetaba los campos de [...]]]></description>
			<content:encoded><![CDATA[<p><span class="intro">En el siguiente artículo encontrarás la solución a la devolución de errores que etiquetan los campos de datos con un DIV utilizando la clase fieldWithErrors en Rails en el diseño de formularios.</span><span id="more-2904"></span></p>
<p>Una de las cosas que más me molestaba de trabajar con formularios en <a href="http://www.maestrosdelweb.com/editorial/rubyonrails/">Rails</a> era la devolución de errores que etiquetaba los campos de datos con un <code>DIV</code> usando un <code>class=”fieldWithErrors”</code>. Digamos que si teníamos en nuestra vista lo siguiente:</p>
<div class="codigo">
<pre>&lt;p&gt;&lt;label for="contacto_nombre"&gt;Nombre completo:&lt;/label&gt;
 &lt;%= text_field 'contacto', 'nombre', :maxlength =&gt; 40 %&gt; *&lt;/p&gt;</pre>
</div>
<p>Y al procesar el formulario ocurría un error en este campo, Rails generaba como salida lo siguiente:</p>
<div class="codigo">
<pre>
&lt;p&gt;&lt;label for="contacto_nombre"&gt;Nombre completo:&lt;/label&gt;&lt;/p&gt;
&lt;div class="fieldWithErrors"&gt;&lt;input id="contacto_nombre" maxlength="30" name="contacto[nombre]&#8221; size=&#8221;30&#8243; value=&#8221;" type=&#8221;text&#8221;&gt;&lt;/div&gt; *</pre>
</div>
<p>Como podrán apreciar, cerraba el párrafo <code>(p)</code> luego de la etiqueta <code>label</code>, y a continuación generaba el <code>div</code> que albergaba al campo con errores. Esto originaba dos saltos de línea que malograba el maquetado inicial del formulario, uno luego del cierre de <code>label</code> y otro luego del cierre del <code>div</code> de error.</p>
<h3>Solucionando el problema</h3>
<p>La solución para modificar este comportamiento lo encontré googleando en <a href="http://wrath.rubyonrails.org/pipermail/rails/2006-February/020505.html">una lista de correo de Rails</a> y le hice algunas modificaciones para hacerlo más flexible para el uso de <a href="http://www.maestrosdelweb.com/editorial/introcss/">CSS</a>:</p>
<div class="codigo">
<pre>ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
    msg = instance.error_message
    error_class = 'error_field'
    if html_tag =~ /&lt;(input|textarea|select)[^&gt;]+class=/
        class_attribute = html_tag =~ /class=['"]/
        html_tag.insert(class_attribute + 7, &#8220;#{error_class} &#8220;)
    elsif html_tag =~ /&lt;(input|textarea|select)/
        first_whitespace = html_tag =~ /\s/
        html_tag[first_whitespace] = &#8221; class=&#8217;#{error_class}&#8217; &#8221;
    end
    html_tag
end</pre>
</div>
<p>Este trozo de código deben agregarlo al <code>archivo /config/enviroment.rb,</code> lo que hace es comprobar si el campo con error ya tiene un atributo <code>class</code>, si es así le agrega al atributo ya existente otro valor con el nombre <code>error_field</code>, sino existe crea <code>class=’error_field’</code>. </p>
<p>Para el ejemplo, la salida devuelta nos daría un marcado más flexible, limpio y fácil de manejar con css de las siguiente forma:</p>
<div class="codigo">
<pre>
&lt;p&gt;&lt;label for="contacto_nombre"&gt;Nombre completo:&lt;/label&gt;
&lt;input class="error_field" id="contacto_nombre" maxlength="30" name="contacto[nombre]&#8221; size=&#8221;30&#8243; value=&#8221;" type=&#8221;text&#8221;&gt; * &lt;/p&gt;</pre>
</div>
<p>Espero que estos tips les sirvan al momento de crear formularios utilizando Rails, para comprender mejor sobre los términos expuestos les recomiendo las siguientes lecturas:</p>
<ul>
<li><a href="http://www.maestrosdelweb.com/editorial/rubyonrails/">Introducción a Ruby on Rails</a></li>
<li><a href="http://www.maestrosdelweb.com/editorial/rorphp/">Ruby on Rails vs PHP: una falsa comparación</a></li>
<li><a href="http://www.maestrosdelweb.com/actualidad/3223/">Los programadores de PHP están interesados en migrar a Rails</a></li>
</ul>
<p>Este artículo es una colaboración del autor, publicado originalmente en <a href="http://www.willywg.com/tags/ruby%20on%20rails">willywg.com</a> por William Wong Garay.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.maestrosdelweb.com/editorial/modificando-el-comportamiento-de-fieldwitherrors-en-rails/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Cómo manipular la altura de capas paralelas con JQuery</title>
		<link>http://www.maestrosdelweb.com/editorial/como-manipular-la-altura-de-capas-paralelas-con-jquery/</link>
		<comments>http://www.maestrosdelweb.com/editorial/como-manipular-la-altura-de-capas-paralelas-con-jquery/#comments</comments>
		<pubDate>Fri, 13 Apr 2007 15:19:38 +0000</pubDate>
		<dc:creator>William Wong Garay</dc:creator>
		
		<category><![CDATA[Ajax]]></category>

		<category><![CDATA[Editorial]]></category>

		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.maestrosdelweb.com/editorial/como-manipular-la-altura-de-capas-paralelas-con-jquery/</guid>
		<description><![CDATA[Aprende a nivelar la altura de dos capas (etiquetadas con DIV) independientemente de cual de ellas sea más alta que la otra, tal como lo haría una tabla con dos columnas con contenidos diversos.
Lo que pretendo a través del siguiente artículo es enseñar a nivelar dos capas (etiquetadas con DIV). Por ejemplo una capa derecha, [...]]]></description>
			<content:encoded><![CDATA[<p><span class='intro'>Aprende a nivelar la altura de dos capas (etiquetadas con DIV) independientemente de cual de ellas sea más alta que la otra, tal como lo haría una tabla con dos columnas con contenidos diversos.</span><span id="more-2488"></span></p>
<p>Lo que pretendo a través del siguiente artículo es enseñar a nivelar dos capas (etiquetadas con DIV). Por ejemplo una capa derecha, que contenga enlaces y bloques de un sitio web, y una capa principal, que contenga artículos puedan nivelar sus alturas independientemente de cual de ellas sea más alta que la otra.</p>
<p>Existen otras formas de hacerlo como las tradicionales tablas que constan de columnas y filas que permiten nivelas los contenidos, pero vamos a aprender hacerlo de otra forma para obtener el siguiente resultado:<br />
<img src='http://www.maestrosdelweb.com/images/jquery.jpg' alt='jquery.jpg' class='lateral'/></p>
<h3>Maquetación del ejemplo</h3>
<p>Para el ejemplo colocaremos dentro de las etiquetas <code>body</code> el siguiente maquetado:</p>
<div class='codigo'>
<pre>
&lt;div id="contenedor"&gt;
    &lt;div id="columna" class="col"&gt;
        test&lt;br /&gt;
        test&lt;br /&gt;
        test&lt;br /&gt;
        test&lt;br /&gt;
    &lt;/div&gt;
    &lt;div id="contenido" class="cont"&gt;
        test&lt;br /&gt;
        test&lt;br /&gt;
        test&lt;br /&gt;
        test&lt;br /&gt;
        test&lt;br /&gt;
        test&lt;br /&gt;
    &lt;/div&gt;
&lt;/div&gt;
</pre>
</div>
<p>Pueden notar que el contenido de columna tiene menos texto que el de contenido, en otras palabras será menos alto que esta última.</p>
<h3>Aplicando los estilos</h3>
<p>El primer paso será generar nuestra hoja de estilos, la cual consta de una capa contenedora a la que llamaremos contenedor. Además, dos capas flotantes, una a la derecha denominada: columna. La otra a la izquierda denominada: contenido. Los atributos que colocaremos a cada capa serán los siguientes:</p>
<div class='codigo'>
<pre>
&lt;style type="text/css"&gt;
    #contenedor{
        width: 300px;
        float: none;
        clear: both;
    }
    #columna{
        background-color:#FFCC99;
        width: 90px;
        float: right;
    }
    #contenido{
        background-color:#66FFCC;
        width: 190px;
        float: left;
    }
&lt;/style&gt;
</pre>
</div>
<p>Lo que hicimos es básicamente posicionar las capas y aplicarle un color de fondo. Si ahora cargamos nuestra web en el navegador veremos que se mostrará con las capas desniveladas en altura.</p>
<h3>Qué es JQuery</h3>
<p>JQuery es una librería de JavaScript rápida y concisa que simplifica el trabajo con documentos <a href="http://www.maestrosdelweb.com/editorial/nivelhtml/">HTML</a>, maneja eventos, realiza animaciones, y agrega interacciones de <a href="http://www.maestrosdelweb.com/editorial/ajax/">Ajax</a> en tus páginas web. JQuery ha sido diseñado para cambiar tu forma de escribir JavaScript.</p>
<h3>Aplicando el JQuery</h3>
<p>Para nivelar las columnas debemos usar JavaScript, para este ejemplo usaré una librería llamada JQuery. La librería de JQuery la pueden <a href="http://jquery.com/src/jquery-latest.pack.js">descargar</a> desde su <a href="http://www.jquery.com/">sitio web</a>. El código que usaremos para nivelar las capas es el siguiente:</p>
<div class='codigo'>
<pre>
&lt;script type="text/javascript" src="./jquery.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
    $(document).ready(function(){
        if ($("div#columna").height() &gt; $("div#contenido").height()) {
            $("div#contenido").height($("div#columna").height())
        }else{
            $("div#columna").height($("div#contenido").height())
        }
    });
&lt;/script&gt;
</pre>
</div>
<p>En la primera línea llamamos a la librería <code>jqueri.js</code>. Luego llamamos al evento <code>ready()</code> que es muy similar al <code>windows.onload</code>, es decir, no permite que ninguna función sea ejecutada a menos de que el DOM este listo para usarse.</p>
<p>Lo que hacemos en el condicional es comprobar si el alto de la capa <code>columna</code> es mayor que el alto de la capa <code>contenido</code>, si es así le asignamos a esta última el alto de la capa <code>columna</code>, en caso contrario hacemos lo opuesto. Para todo esto hacemos uso de la propiedad <code>height()</code> que nos calcula el alto de la capa, y de <code>height(valor)</code> para asignarle una altura.</p>
<p>Como ven el código no es muy complejo, como es obvio es posible de hacerse también con JavaScript puro, opté por jQuery porque lo estoy usando en el rediseño del sitio web de mi empresa. </p>
<p>Este artículo es una colaboración del autor el cual fue publicado originalmente en <a href="http://www.willywg.com/2007/4/3/nivelando-la-altura-de-capas-paralelas-con-jquery">willywg.com</a> por William Wong Garay.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.maestrosdelweb.com/editorial/como-manipular-la-altura-de-capas-paralelas-con-jquery/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Optimizando una web con urls amigables con Apache y PHP</title>
		<link>http://www.maestrosdelweb.com/editorial/urlamigable/</link>
		<comments>http://www.maestrosdelweb.com/editorial/urlamigable/#comments</comments>
		<pubDate>Thu, 06 Jul 2006 00:00:00 +0000</pubDate>
		<dc:creator>William Wong Garay</dc:creator>
		
		<category><![CDATA[Editorial]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[SEO]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[En este manual usted aprenderá cómo optimizar de manera sencilla una web dinámica hecha en PHP, cuyas urls pasadas a los enlaces contengan extensas variables mediante GET, a una web cuyas URL sean amigables (fáciles de recordar).
Los que programamos en PHP, o  bajo cualquier otro lenguaje de programaci&#243;n orientado a web, por lo general [...]]]></description>
			<content:encoded><![CDATA[<p><span class="intro">En este manual usted aprenderá cómo optimizar de manera sencilla una web dinámica hecha en PHP, cuyas urls pasadas a los enlaces contengan extensas variables mediante GET, a una web cuyas URL sean amigables (fáciles de recordar).</span><span id="more-49"></span></p>
<p>Los que programamos en PHP, o  bajo cualquier otro lenguaje de programaci&oacute;n orientado a web, por lo general  tendemos a pasar datos de una web origen a otra destino mediante variables del  tipo GET generando enlaces tal como:</p>
<p>    <a href="http://www.tiperu.com/index.php?mod=ecommerce&amp;producto=tienda&amp;op=3">http://www.tiperu.com/index.php?mod=ecommerce&amp;producto=tienda&amp;op=3</a> que dif&iacute;cilmente son indexadas por  algunos buscadores y lo que es peor a&uacute;n: son nada asimilables por un usuario  com&uacute;n (a este grupo de URL las llamaremos <strong>URL extensas </strong>para efectos del  presente art&iacute;culo). </p>
<p> Si lo vemos desde esa perspectiva  justo ser&iacute;a afirmar que las web din&aacute;micas tienen desventajas en ese &aacute;mbito  sobre las web est&aacute;ticas del tipo <a href="http://www.tiperu.com/ecommerce.html">http://www.tiperu.com/ecommerce.html</a> que son mucho m&aacute;s f&aacute;ciles de  recordar por su simpleza y carencia de variables v&iacute;a GET, a este tipo de URL  las conocemos (y me referir&eacute; a ellas en adelante) como URL amigables.</p>
<p>  Quiero dejar en claro que lejos de la divisi&oacute;n convencional entre lo  que son web est&aacute;ticas o din&aacute;micas en este manual me referir&eacute; a ambas en funci&oacute;n  a la diferencia de URL especificadas en el p&aacute;rrafo anterior&nbsp; hecha la aclaraci&oacute;n continuo con el art&iacute;culo.</p>
<p> Felizmente para los que usamos  Apache como servidor web, conjuntamente con PHP, esto tiene soluci&oacute;n gracias al  m&oacute;dulo mod_rewrite (URL Rewriting Engine) que nos permitir&aacute; mediante unas cuantas reglas  transformar nuestras URL extensas en URL amigables.</p>
<p> Si bien es altamente aconsejable  aprender el correcto manejo del mod_rewrite y sus correspondientes  reglas, en este art&iacute;culo no se har&aacute; explicaci&oacute;n extensiva del mismo.</p>
<p> Debido a que el objetivo  principal, es mostrar al lector c&oacute;mo optimizar una web de URL extensas a URL amigables;  con esto quiero dejar claro que se asume que el lector posee un website ya  creado con URL extensas y desea pasarlas f&aacute;cilmente a URL amigables <em>&ldquo;en un dos por tres&rdquo;</em><em>.</em></p>
<h3>Preparando el archivo  &ldquo;.htaccess&rdquo;:</h3>
<p>  El archivo .htaccess<strong> </strong>nos permite pasarle  informaci&oacute;n al servidor Apache para que cumpla ciertas reglas de configuraci&oacute;n  en la carpeta que lo contenga, por tal motivo debemos copiar este archivo en la  carpeta que contengan los archivos php en los cuales realizaremos los cambios  de URL:</p>
<div class="codigo">
<pre>Options +FollowSymLinks
RewriteEngine on
#4 variables
Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&amp;$4=$5&amp;$6=$7&amp;$8=$9
#3 variables
Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&amp;$4=$5&amp;$6=$7
#2 variables
Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&amp;$4=$5
#1 variable
Rewriterule ^(.*)/(.*),(.*)/$ $1.php?$2=$3</pre>
</div>
<p>En las dos primeras l&iacute;neas nos  aseguramos de que est&eacute; activado el mod_rewrite en el Apache (si esto no  funciona deber&aacute; comunicarse con su administrador para que active el m&oacute;dulo en  el servidor).</p>
<p> Las l&iacute;neas antecedidas por &ldquo;#&rdquo;,  como las 3, 5, 7 y 9 ; son simplemente comentarios, no los tome en cuenta.</p>
<p> En las l&iacute;neas 4, 6, 8 y 10 se  establecen las reglas que nos permitir&aacute;n transformar nuestras URL extensas en  amigables. Analizaremos aquella que permite transformar dos variables, las  dem&aacute;s son similares:</p>
<div class="codigo">
<pre>Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&amp;$4=$5</pre>
</div>
<p> La expresi&oacute;n (Rewriterule) es la que nos  permitir&aacute; escribir la regla en el Apache. La cadena (^(.*)/(.*),(.*)/(.*),(.*)/$)    permite escribir&aacute; la URL amigable, inicia desde el caracter <strong>^</strong> hasta el $. Y finalmente la cadena  ($1.php?$2=$3&amp;$4=$5) es nuestro URL  extenso. La transformaci&oacute;n se har&aacute; de la siguiente manera:</p>
<p>  <strong>De URL extensa:</strong></p>
<p>./index.php?categoria=monitores&amp;productoID=12345</p>
<p>  <strong>En URL amigable:</strong></p>
<p>./index/categoria,monitores/productoID,12345/</p>
<p> Como se puede apreciar la regla  tomara el nombre del script y le quitara la extensi&oacute;n &ldquo;.php&rdquo; para tomarlo como  un directorio (n&oacute;tese la parte en negritas):</p>
<div class="codigo">
<pre>Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&amp;$4=$5</pre>
</div>
<p>./i<strong>ndex.php</strong>?categoria=monitores&amp;productoID=12345<br />
./<strong>index/</strong>categoria,monitores/productoID,12345/</p>
<p> Seguidamente toma el primer par <strong>?valor=variable</strong> y lo transfroma en una subcarpeta <strong>valor,variable/</strong>:</p>
<div class="codigo">
<pre>Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&amp;$4=$5</pre>
</div>
<p>./index.php<strong>?categoria=monitores</strong>&amp;productoID=12345<br />
./index/<strong>categoria,monitores/</strong>productoID,12345/</p>
<p> Y finalmente hace lo propio con  el par <strong>&amp;valor=variable</strong> y lo transforma en una subcarpeta <strong>valor,variable/</strong>:</p>
<div class="codigo">
<pre>Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&amp;$4=$5</pre>
</div>
<p>./index.php?categoria=monitores<strong>&amp;productoID=12345</strong><br />
./index/categoria,monitores/<strong>productoID,12345/</strong></p>
<p> Como ya se habr&aacute; dado cuenta, los  valores antecedidos por el s&iacute;mbolo d&oacute;lar ($) en la parte de  las URL extensas reemplazan a los (.*) de las URL amigables.</p>
<p> Bueno ya tenemos el archivo .htacces que nos permitir&aacute; lograr los resultados que deseamos a nivel del servidor,  ahora procederemos a crear el script php que nos permita cambiar nuestras URL  extensas en amigables sin tener que hacer ninguna modificaci&oacute;n directa en los  &ldquo;N&rdquo; enlaces que posea nuestro sitio web.</p>
<h3>Generando el script en  php:</h3>
<p>  El script php que se usaremos se  encargar&aacute; b&aacute;sicamente de tomar la URL extensa, si esta ha sido pasada  mediante el m&eacute;todo GET, y la transformar&aacute; en una URL amigable a la cual redireccionar&aacute; usando la funci&oacute;n header. </p>
<p> Puesto que header redireccionar&aacute;  hacia la misma web, y esto causar&aacute; lo que se conoce como un bucle infinito, se  har&aacute; uso de variables de sesi&oacute;n que nos ayuden a evitar tal inconveniente.</p>
<p> Por tal motivo nuestro script se  seccionar&aacute; en 2 partes: la primera ir&aacute; en las primeras l&iacute;neas de todas las  p&aacute;ginas a las que aplicaremos el script, y la segunda parte (encargada de  limpiar la variable de sesi&oacute;n) ir&aacute; al final de las p&aacute;ginas. </p>
<p>Aclarados los detalles, explicar&eacute;  mediante comentarios el script php:</p>
<div class="codigo">
<pre>&lt;?php

//Iniciamos o continuamos la sesi&oacute;n encargada de evitar el bucle infinito

	session_name(&quot;url_amigable&quot;);
	session_start(); //Almacenamos datos del server, script y variables (pasadas por GET)
	$Server=$_SERVER[&acute;SERVER_NAME&acute;];
	$Script=$_SERVER[&acute;PHP_SELF&acute;];
	$Variables=$_SERVER[&acute;QUERY_STRING&acute;]; //Verificando si tiene variables por GET

//y no se han pasado datos mediante un form por POST, ya que al redireccionar un post puede ocasionar errores.
//también verificamos que la variable de sesión &lsquo;Listo&rsquo;, sea diferente a 1, esto nos eviara un bucle infinito.

	if(!empty($Variables) &amp; $_SERVER[&rsquo;REQUEST_METHOD&rsquo;]==&rsquo;GET&rsquo; &amp;&amp; $_SESSION[&rsquo;Listo&rsquo;]!=1){

//Si tiene variables pasadas por GET se procede a hacer el cambio.
//1. Agrupando $Variables por &ldquo;variable=valor&rdquo; en el array $Variable.

$Variable=explode(&rdquo;&amp;&rdquo;,$Variables);
//2. Sustituyendo &ldquo;=&rdquo; por &ldquo;,&rdquo; y concadenandolo en variable $Amigable.
($i=0; $i &lt; count($Variable); $i++){
$Amigable.=&quot;/&quot;.str_replace(&quot;=&quot;,&quot;,&quot;,$Variable[$i]);
} //3. Quitando la extension &ldquo;.php&rdquo; a $Script para simular un directorio.

$Dir=str_replace(&rdquo;.php&rdquo;,&rdquo;&quot;,$Script); //4. Generando la URL Amigable.
$URL_AMIGABLE=&rdquo;http://&rdquo;.$Server.$Dir.$Amigable.&rdquo;/&rdquo;;
//5. Colocando la variable de sesión &lsquo;Listo&rsquo; a 1 para evitar el bucle infinito al redireccionar la web.

$_SESSION[&rsquo;Listo&rsquo;]=1;
//6. Redireccionando a la url amigable

header(&rdquo;Location: $URL_AMIGABLE&rdquo;);
//7. Exit hará que culmine hasta este punto el script, si no estuviera &lsquo;exit&rsquo;el script continuaría ejecutándose y llegaría hasta el final del mismo, es decir,
// a la parte donde colocamos a la variable de sesión &lsquo;Listo&rsquo; en cero, originándose, entonces un bucle infinito.
exit;

}//Cambie $_URL_BASE por la ruta raiz de su web, ya que al simular la url amigable.
//directorios, hará que no muestre adecuadamente los orígenes de los recursos que llama su página web.

$_URL_BASE=&quot;http://&rdquo;.$Server.&rdquo;/pruebas/url_amigable/index.php&quot;;
?&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title &gt;URL Amigables&lt;/title&gt;
&lt;base href = &quot;&lt;? echo $_URL_BASE; ?&gt;&quot; target=&quot;_top&quot; /&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;!&#8211; Aquí el contenido de su página web &#8211;&gt;
&lt;/body&gt;
&lt;/html&gt;
&lt;?php
//Limpia el posible bucle, es decir, se puede volver a hacer el envío.
$_SESSION[&rsquo;Listo&rsquo;]=0;
?&gt;</pre>
</div>
<h3>Recomendaciones finales:</h3>
<p> Como habr&aacute;n podido ver el script  no es complicado, y la adaptaci&oacute;n a una web ya constituida tampoco lo ser&aacute;. Ya he  probado la t&eacute;cnica en uno de mis proyectos (de manera local) y me ha funcionado  bastante bien.</p>
<p>  Lo que s&iacute; quiero aclarar es que  al momento de testear esta t&eacute;cnica en una url de 5 variables a m&aacute;s me gener&oacute;  errores (b&aacute;sicamente no encuentra la url amigable generada); una url de 4  variables redirecciona correctamente, pero si luego de ello refresco el  navegador genera el mismo error, es decir, no (re)carga la url amigable.</p>
<p> Mi consejo es que usen esta  t&eacute;cnica en una url de 3 a menos de 3 variables pasadas por GET y personalicen  este script a sus necesidades. Y como es l&oacute;gico, les aconsejo bastante  informarse m&aacute;s sobre el uso del mod_rewrite en Apache, creanme que  les aliviar&aacute; m&aacute;s de un dolor de cabeza.</p>
<p>  Finalmente les dir&eacute; que pueden  descargarse el script desde aqu&iacute;: <a href="http://www.maestrosdelweb.com/editorial/util/url_amigable.zip">url_amigable.zip</a>.</p>
<p> Este art&iacute;culo fue publicado  originalmente en <a href="http://willy.tiperu.com/index.php/optimizando-una-web-de-url-extensas-a-url-amigables-con-apache-y-php">willy.tiperu.com</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.maestrosdelweb.com/editorial/urlamigable/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Manual básico de creación de Host virtuales en Apache</title>
		<link>http://www.maestrosdelweb.com/editorial/host/</link>
		<comments>http://www.maestrosdelweb.com/editorial/host/#comments</comments>
		<pubDate>Mon, 27 Mar 2006 00:00:00 +0000</pubDate>
		<dc:creator>William Wong Garay</dc:creator>
		
		<category><![CDATA[Editorial]]></category>

		<category><![CDATA[Software Libre]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Un host virtual, o VirtualHost, en Apache nos permite mantener múltiples nombres de host en nuestro servidor.
Introducci&#243;n 
El presente manual permite explicar de manera sencilla y concisa c&#243;mo crearlos en nuestro servidor local y configurar nuestro sistema operativo para que acepte dichos nombres de host.  Muchos de nosotros estamos acostumbrados a trabajar en nuestro [...]]]></description>
			<content:encoded><![CDATA[<p><span class="intro">Un host virtual, o VirtualHost, en Apache nos permite mantener múltiples nombres de host en nuestro servidor.</span><span id="more-322"></span></p>
<h3>Introducci&oacute;n </h3>
<p>El presente manual permite explicar de manera sencilla y concisa c&oacute;mo crearlos en nuestro servidor local y configurar nuestro sistema operativo para que acepte dichos nombres de host.  Muchos de nosotros estamos acostumbrados a trabajar en nuestro servidor web local para nuestros proyectos en modo de prueba o testeo, y por lo generalmente tenemos m&aacute;s de un proyecto en camino, sea laboral (p.e. el web site de un cliente) o personal (p.e. nuestro blog o comunidad virtual). Solemos guardar estos proyectos en carpetas separadas dentro un directorio tal como C:/www/ que ser&iacute;a nuestro directorio ra&iacute;z web (desde el cual llamamos a nuestro cl&aacute;sico <a href="http://localhost/">http://localhost </a> ), y llamar a nuestros proyectos de la siguiente manera en nuestro navegador preferido: </p>
<p><a href="http://localhost/tiperu">http://localhost/tiperu </a> , </p>
<p><a href="http://localhost/willyblog">http://localhost/willyblog </a> , </p>
<p><a href="http://localhost/bazar">http://localhost/bazar </a>, entro otros por citar un ejemplo. </p>
<p>En cierto modo podemos trabajar de manera regularmente c&oacute;moda, pero quiz&aacute; desear&iacute;amos usar el nombre del dominio real con el que trabajos estos proyectos en la Internet. As&iacute; podr&iacute;amos hacer usar lo siguiente: </p>
<p><a href="http://www.tiperu.com/">http://www.tiperu.com </a>en lugar de <a href="http://localhost/tiperu">http://localhost/tiperu </a> , </p>
<p><a href="http://willy.tiperu.com/">http://willy.tiperu.com </a>en lugar de <a href="http://localhost/willyblog">http://localhost/willyblog </a> , o </p>
<p><a href="http://www.bazarperu.com/">http://www.bazarperu.com </a>en lugar de <a href="http://localhost/bazar">http://localhost/bazar </a></p>
<p>Y c&oacute;mo hacemos esto?, pues la respuesta es sencilla, configurando la directiva VirtualHost de nuestro servidor Apache y el archivo host de nuestro Sistema Operativo (<a href="http://www.maestrosdelweb.com/principiantes/historia-de-windows/">Windows</a> o Linux). </p>
<h3>Configurando el archivo host </h3>
<p>Lo primero que configuraremos ser&aacute; el archivo <strong>host </strong> de nuestro SO, para Linux lo podemos encontrar en el directorio /etc/ mientras que para Windows XP lo encontramos en C:/Windows/System32/Drivers/etc/. Este archivo lo que hace es asignar direcciones IP a los nombres de host, para que al colocar por ejemplo 127.0.0.1 o localhost en nuestro navegador nos redireccione al mismo contenido. No se sorprenda si encuentra el siguiente par en el archivo host: 127.0.0.1 localhost, d&oacute;nde el primer valor es nuestra direcci&oacute;n IP local y el segundo el nombre del host. </p>
<p>Lo que haremos ahora es colocar tantas entradas cono deseemos para nuestros proyectos, relacionando la IP local con nuestros nombres de dominio. Para el ejemplo tomaremos las rutas que di anteriormente, las cuales se colocar&aacute;n debajo del par 127.0.0.1 localhost: </p>
<div class="codigo">
<pre>#localhost
127.0.0.1 localhost
#TIPeru COM SAC (Mi empresa de hosting)
127.0.0.1 www.tiperu.com
#Mi blog
127.0.01 willy.tiperu.com
#BazarPeru (Tienda Virtual)
127.0.0.1 www.bazarperu.com </pre>
</div>
<p>N&oacute;tese que he colocado el caracter &ldquo;#&rdquo; . Este car&aacute;cter nos permite ingresar un texto a manera de comentario. Bueno, una vez hechos estos cambios procedemos a guardar el archivo. </p>
<p>Para confirmar su funcionamiento abra su navegador y digite cualquiera de los nombres de host que ha agregado, recuerde de respetar el nombre completo, ya que una entrada del tipo tiperu.com no tendr&iacute;a efecto por carecer del www. que lo antecede. </p>
<p>Si al ingresar el nombre del host le muestra el contenido de su <a href="http://localhost/">http://localhost </a> significa que la asignaci&oacute;n de IP para el nombre de host a tenido efecto. N&oacute;tese que a&uacute;n su nombre de host no apunta a la carpeta en la que se guarda su proyecto. Este punto lo veremos a continuaci&oacute;n. </p>
<h3>Configurando el archivo httpd.conf del Apache</h3>
<p>Ahora configuraremos nuestro servidor Apache para que acepte los nombres de dominio agregados al archivo host y los relacione con las carpetas que albergan los archivos de nuestros proyectos. Para ello abriremos el archivo <strong>conf/httpd.conf </strong> y nos dirigiremos a la siguiente secci&oacute;n: </p>
<div class="codigo">
<pre>#
# Virtual Hosts
#
# If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn't need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#</pre>
</div>
<h4><strong>Notas: </strong></h4>
<p>&#8226;&nbsp; Haga una copia de respaldo de sus archivos de configuraci&oacute;n antes de realizar cualquier cambio en ellos. </p>
<p>&#8226;&nbsp; Si no encuentra la secci&oacute;n Virtual Hosts en el archivo httpd.conf quiz&aacute; lo pueda ubicar en la siguiente ruta <strong>conf/extra/httpd-vhosts.conf </strong></p>
<p>Luego procederemos a quitar el comentario de ##NameVirtualHost *:80 dej&aacute;ndolo de la siguiente manera: </p>
<div class="codigo">
<pre>#
# Use name-based virtual hosting.
#
NameVirtualHost *:80
#</pre>
</div>
<p>Esta acci&oacute;n nos permisita trabajar con host virtuales basados en nombres. El * representa un n&uacute;mero IP y puede ser reemplazado por uno de ellos si desee. Para el ejemplo d&eacute;jelo tal y como esta. </p>
<p>Enseguida procederemos a configurar los host virtuales, agreg&aacute;ndolos de la siguiente manera: </p>
<div class="codigo">
<pre>#localhost
&lt;VirtualHost *:80&gt;
DocumentRoot &quot;C:/www&quot;
ServerName localhost:80
&lt;/VirtualHost&gt; 

#TIPeru COM SAC
&lt;VirtualHost *:80&gt;
DocumentRoot &quot;C:/wwww/tiperu&quot;
ServerName www.tiperu.com
&lt;/VirtualHost&gt; 

#Mi Blog
&lt;VirtualHost *:80&gt;
ServerAdmin willy@tiperu.com
DocumentRoot &quot;C:/wwww/willy&quot;
ServerName willy.tiperu.com
&lt;/VirtualHost&gt;
#BazarPeru
&lt;VirtualHost *:80&gt;
ServerAdmin webmaster@bazarperu.com
DocumentRoot &quot;C:/wwww/bazar&quot;
ServerName www.bazarperu.com
&lt;/VirtualHost&gt;</pre>
</div>
<p>Como se puede aprecia cada Virtual Host esta encerrado entre las etiquetas &lt;VirtualHost&gt; y &lt;/VirtualHost&gt; que contiene el par&aacute;metro *:80 que es NameHostVirtual al cual se refiere. Dentro de estas etiquetas, 2 valores son esenciales para que funcionen correctamente nuestros host virtuales: </p>
<p>&#8226;&nbsp; <strong>DocumentRoot. </strong> Que es la ruta en la cual se guarda nuestra p&aacute;gina web; y </p>
<p>&#8226;&nbsp; <strong>ServerName </strong>. Que es el nombre del host que previamente agregamos al archivo host de nuestro S.O. </p>
<p>Adicionalmente podemos agregar otros valores, tal como si cada host virtual fuera un host independiente (p.e. ServerAdmin). </p>
<p>N&oacute;tese algo muy importante. Si bien localhost es nuestro servidor local por defecto, debemos tambi&eacute;n agregarlo con un virtual host para que todo trabaje en orden, y debemos agregarle los mismos valores del DocumentRoot y ServerName que posee en su configuraci&oacute;n global, de lo contrario no cargar&aacute; el host. </p>
<p>Finalmente lo que haremos es para el servicio de nuestro servidor Apache y volverlo a inciar. Si tod o esta correctamente configurado podemos cargar en nuestro navegador uno de los nombres de host y ver los resultados (p.e. <a href="http://www.tiperu.com/">www.tiperu.com </a>). Si carga el contenido de la carpeta que le hemos asignado en el &lt;VirtualHost&gt; y no el directorio raiz del localhost quiere decir que todo esta correcto. Felicidades Ud. Ya tiene configurado su host virtual !!! </p>
<h3>Agradecimientos </h3>
<p>Al equipo de <a href="http://www.tiperu.com/">TIPeru COM </a> por su contante apoyo. Y a la Asociaci&oacute;n Nacional de Webmaster del Per&uacute; ( <a href="http://anwmp.org/">ANWMP </a>) por resolver mis dudas e interrogantes mediante sus foros y Chat en l&iacute;nea. </p>
<h3>Bibliograf&iacute;a b&aacute;sica en l&iacute;nea </h3>
<p>Soporte Apache de hosts virtuales basados en nombre </p>
<p><a href="http://quark.fe.up.pt/ApachES/manual-es/vhosts/name-based.html">http://quark.fe.up.pt/ApachES/manual-es/vhosts/name-based.html </a></p>
<p>Configuraci&oacute;n de Apache | Cibernetia </p>
<p><a href="http://www.cibernetia.com/manuales/instalacion_servidor_web/2_3_configuracion_apache.php">http://www.cibernetia.com/manuales/instalacion_servidor_web/2_3_configuracion_apache.php </a></p>
<p>Virtual Host examples for common setups </p>
<p><a href="http://quark.fe.up.pt/ApachES/manual-es/vhosts/examples.html">http://quark.fe.up.pt/ApachES/manual-es/vhosts/examples.html </a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.maestrosdelweb.com/editorial/host/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
