PrestaShop, PrestaBlog y enlaces amigables en IIS

Aunque PrestaShop esta pensado para trabajar en un entorno “Apache” (php+mysql) a veces nos encontraremos con la necesidad de instalarlo sobre una plataforma IIS (Internet Information Server). Esta instalación se puede hacer sin mayor problema dentro de un IIS con el paquete Wamp o Xampp, pero donde encontraremos el mayor problema será a la hora de querer cambiar la estructura de enlaces amigables para tener unas URLs más limpias, entendibles y sobre todo SEO.

El problema con la reescritura de enlaces (rewrite) en IIS es que PrestaShop se apoya en el fichero .htaccess para llevar a cabo esta tarea, y este tipo de fichero de configuración no existe en IIS y hay que usar en su defecto el fichero web.config como una posible solución.

El principal problema es que este cambio no es automático si hemos instalado nuestro PrestaShop sobre un IIS, así que si activamos la opción de “Enlaces Amigables” (que se encuentra dentro del menú Preferencias -> SEO + URLs) nos encontraremos que nuestra tienda Prestashop deja de funcionar (nos dará un Error 404 en el mejor de los casos ya que no será capaz de encontrar las rutas de los archivos), con lo que tendremos que configurar nosotros mismos el fichero web.config para que haga uso del módulo rewrite de IIS correctamente.

Ahora veremos una configuración para que funcione nuestro PrestaShop con enlaces permanentes y después como añadir las reglas para que también funcione el módulo de blog PrestaBlog si es que también queremos usarlo. Estas líneas han de ir dentro de la etiqueta <system.webServer> del web.config.

La configuración del web.config básicamente es la misma que la del .htaccess pero con las peculiaridades de su lenguaje (como el cambio del $2 por {R:2} y las etiquetas). Tras hacer las conversiones necesarias, un web.config general para que funcione nuestro PrestaShop quedaría así:


<rewrite>
	<rules>
		<rule name="Imported Rule 1" stopProcessing="true">
			<match url="^api/?(.*)$" ignoreCase="false" />
			<action type="Rewrite" url="webservice/dispatcher.php?url={R:1}" appendQueryString="true" />
		</rule>
		<rule name="Imported Rule 2" stopProcessing="true">
			<match url="^([a-z0-9]+)\-([a-z0-9]+)(\-[_a-zA-Z0-9-]*)(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}-{R:2}{R:3}{R:4}.jpg" />
		</rule>
		<rule name="Imported Rule 3" stopProcessing="true">
			<match url="^([0-9]+)\-([0-9]+)(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}-{R:2}{R:3}.jpg" />
		</rule>
		<rule name="Imported Rule 4" stopProcessing="true">
			<match url="^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}/{R:1}{R:2}{R:3}.jpg" />
		</rule>
		<rule name="Imported Rule 5" stopProcessing="true">
			<match url="^([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}/{R:2}/{R:1}{R:2}{R:3}{R:4}.jpg" />
		</rule>
		<rule name="Imported Rule 6" stopProcessing="true">
			<match url="^([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}/{R:2}/{R:3}/{R:1}{R:2}{R:3}{R:4}{R:5}.jpg" />
		</rule>
		<rule name="Imported Rule 7" stopProcessing="true">
			<match url="^([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}/{R:2}/{R:3}/{R:4}/{R:1}{R:2}{R:3}{R:4}{R:5}{R:6}.jpg" />
		</rule>
		<rule name="Imported Rule 8" stopProcessing="true">
			<match url="^([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}/{R:2}/{R:3}/{R:4}/{R:5}/{R:1}{R:2}{R:3}{R:4}{R:5}{R:6}{R:7}.jpg" />
		</rule>
		<rule name="Imported Rule 9" stopProcessing="true">
			<match url="^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}/{R:2}/{R:3}/{R:4}/{R:5}/{R:6}/{R:1}{R:2}{R:3}{R:4}{R:5}{R:6}{R:7}{R:8}.jpg" />
		</rule>
		<rule name="Imported Rule 10" stopProcessing="true">
			<match url="^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}/{R:2}/{R:3}/{R:4}/{R:5}/{R:6}/{R:7}/{R:1}{R:2}{R:3}{R:4}{R:5}{R:6}{R:7}{R:8}{R:9}.jpg" />
		</rule>
		<rule name="Imported Rule 11" stopProcessing="true">
			<match url="^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}/{R:2}/{R:3}/{R:4}/{R:5}/{R:6}/{R:7}/{R:8}/{R:1}{R:2}{R:3}{R:4}{R:5}{R:6}{R:7}{R:8}{R:9}{R:1}0.jpg" />
		</rule>
		<rule name="Imported Rule 12" stopProcessing="true">
			<match url="^c/([0-9]+)(\-[_a-zA-Z0-9-\.*]*)(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/c/{R:1}{R:2}{R:3}.jpg" />
		</rule>
		<rule name="Imported Rule 13" stopProcessing="true">
			<match url="^c/([a-zA-Z-]+)(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/c/{R:1}{R:2}.jpg" />
		</rule>
		<rule name="Imported Rule 14" stopProcessing="true">
			 <match url="^.*$" />
			 <conditions logicalGrouping="MatchAny">
				 <add input="{REQUEST_FILENAME}" matchType="IsFile" pattern="" ignoreCase="false" />
				 <add input="{REQUEST_FILENAME}" matchType="IsDirectory" pattern="" ignoreCase="false" />
			 </conditions>
			 <action type="None" />
		 </rule>
		 <rule name="Imported Rule 15" stopProcessing="true">
			<match url="^.*$" />
			 <action type="Rewrite" url="index.php" />
		</rule>
	</rules>
</rewrite>

Este código es suficiente sino vamos a usar ningún otro módulo que genere nuevas páginas con estructura propia de URLs, pero si queremos tener un blog dentro de PrestaShop veremos que no funciona al tener los enlaces permanentes activados. Esto es debido a que como vemos en la pantalla de configuración es necesario añadir nuevas reglas al .htaccess, que en nuestro caso seria el archivo web.config. Como en el caso anterior deberemos convertir el código para el rewrite de apache a IIS con lo que el código que nos ofrece PrestaBlog en sus opciones de configuración para añadir al .htaccess:


RewriteRule ^(.*)blog$ /index.php?fc=module&module=psblog&controller=posts [QSA,L] 
RewriteRule ^(.*)blog/([0-9]+)\-([a-zA-Z0-9-]*) /index.php?fc=module&module=psblog&controller=posts&post=$2 [QSA,L] 
RewriteRule ^(.*)blog/category/([0-9]+)\-([a-zA-Z0-9-]*) /index.php?fc=module&module=psblog&controller=posts&category=$2 [QSA,L] 

Pasaría a ser este en un web.config:


<rule name="Imported Rule 14" stopProcessing="true">
	<match url="^(.*)blog$"  />
	<action type="Rewrite" url="//index.php?fc=module&module=psblog&controller=posts"  appendQueryString="true" />
</rule>
<rule name="Imported Rule 15" stopProcessing="true">
	<match url="^(.*)blog/([0-9]+)\-([a-zA-Z0-9-]*)"  />
	<action type="Rewrite" url="//index.php?fc=module&module=psblog&controller=posts&post={R:2}"  appendQueryString="true" />
</rule>
<rule name="Imported Rule 16" stopProcessing="true">
	<match url="^(.*)blog/category/([0-9]+)\-([a-zA-Z0-9-]*)"  />
	<action type="Rewrite" url="//index.php?fc=module&module=psblog&controller=posts&category={R:2}"  appendQueryString="true" />
</rule>

Si juntamos los dos códigos nuestro web.config para que funcionen los enlaces permanentes/amigables en PrestaShop y PrestaBlog en IIS sería el siguiente:


<rewrite>
	<rules>
		<rule name="Imported Rule 1" stopProcessing="true">
			<match url="^api/?(.*)$" ignoreCase="false" />
			<action type="Rewrite" url="webservice/dispatcher.php?url={R:1}" appendQueryString="true" />
		</rule>
		<rule name="Imported Rule 2" stopProcessing="true">
			<match url="^([a-z0-9]+)\-([a-z0-9]+)(\-[_a-zA-Z0-9-]*)(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}-{R:2}{R:3}{R:4}.jpg" />
		</rule>
		<rule name="Imported Rule 3" stopProcessing="true">
			<match url="^([0-9]+)\-([0-9]+)(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}-{R:2}{R:3}.jpg" />
		</rule>
		<rule name="Imported Rule 4" stopProcessing="true">
			<match url="^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}/{R:1}{R:2}{R:3}.jpg" />
		</rule>
		<rule name="Imported Rule 5" stopProcessing="true">
			<match url="^([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}/{R:2}/{R:1}{R:2}{R:3}{R:4}.jpg" />
		</rule>
		<rule name="Imported Rule 6" stopProcessing="true">
			<match url="^([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}/{R:2}/{R:3}/{R:1}{R:2}{R:3}{R:4}{R:5}.jpg" />
		</rule>
		<rule name="Imported Rule 7" stopProcessing="true">
			<match url="^([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}/{R:2}/{R:3}/{R:4}/{R:1}{R:2}{R:3}{R:4}{R:5}{R:6}.jpg" />
		</rule>
		<rule name="Imported Rule 8" stopProcessing="true">
			<match url="^([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}/{R:2}/{R:3}/{R:4}/{R:5}/{R:1}{R:2}{R:3}{R:4}{R:5}{R:6}{R:7}.jpg" />
		</rule>
		<rule name="Imported Rule 9" stopProcessing="true">
			<match url="^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}/{R:2}/{R:3}/{R:4}/{R:5}/{R:6}/{R:1}{R:2}{R:3}{R:4}{R:5}{R:6}{R:7}{R:8}.jpg" />
		</rule>
		<rule name="Imported Rule 10" stopProcessing="true">
			<match url="^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}/{R:2}/{R:3}/{R:4}/{R:5}/{R:6}/{R:7}/{R:1}{R:2}{R:3}{R:4}{R:5}{R:6}{R:7}{R:8}{R:9}.jpg" />
		</rule>
		<rule name="Imported Rule 11" stopProcessing="true">
			<match url="^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/p/{R:1}/{R:2}/{R:3}/{R:4}/{R:5}/{R:6}/{R:7}/{R:8}/{R:1}{R:2}{R:3}{R:4}{R:5}{R:6}{R:7}{R:8}{R:9}{R:1}0.jpg" />
		</rule>
		<rule name="Imported Rule 12" stopProcessing="true">
			<match url="^c/([0-9]+)(\-[_a-zA-Z0-9-\.*]*)(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/c/{R:1}{R:2}{R:3}.jpg" />
		</rule>
		<rule name="Imported Rule 13" stopProcessing="true">
			<match url="^c/([a-zA-Z-]+)(-[0-9]+)?/.+\.jpg$" ignoreCase="false" />
			<action type="Rewrite" url="img/c/{R:1}{R:2}.jpg" />
		</rule>

		<rule name="Imported Rule 14" stopProcessing="true">
			<match url="^(.*)blog$"  />
			<action type="Rewrite" url="//index.php?fc=module&module=psblog&controller=posts"  appendQueryString="true" />
		</rule>
		<rule name="Imported Rule 15" stopProcessing="true">
			<match url="^(.*)blog/([0-9]+)\-([a-zA-Z0-9-]*)"  />
			<action type="Rewrite" url="//index.php?fc=module&module=psblog&controller=posts&post={R:2}"  appendQueryString="true" />
		</rule>
		<rule name="Imported Rule 16" stopProcessing="true">
			<match url="^(.*)blog/category/([0-9]+)\-([a-zA-Z0-9-]*)"  />
			<action type="Rewrite" url="//index.php?fc=module&module=psblog&controller=posts&category={R:2}"  appendQueryString="true" />
		</rule>

		<rule name="Imported Rule 17" stopProcessing="true">
			 <match url="^.*$" />
			 <conditions logicalGrouping="MatchAny">
				 <add input="{REQUEST_FILENAME}" matchType="IsFile" pattern="" ignoreCase="false" />
				 <add input="{REQUEST_FILENAME}" matchType="IsDirectory" pattern="" ignoreCase="false" />
			 </conditions>
			 <action type="None" />
		 </rule>
		 <rule name="Imported Rule 18" stopProcessing="true">
			<match url="^.*$" />
			 <action type="Rewrite" url="index.php" />
		</rule>
	</rules>
</rewrite>

¿Necesitas más reglas de rewrite porque has instalado otro módulo? Siempre puedes convertir las reglas de un .htaccess a un web.config con esta herramienta online de CodeBreak.

PrestaShop

3 responses to PrestaShop, PrestaBlog y enlaces amigables en IIS


  1. Gracias por compartir la información, no sabía si se podía hacer o cómo y creo que ahora ya lo tengo un poco más claro, la verdad es que soy más de Apache ;-)
    Espero que algún día saquen un módulo o versión especial para servidores Windows, de forma que no requiera mantenimiento.

  2. Si, yo también prefiero Apache, pero a veces toca bailar con la más fea :D
    Un saludo!

  3. Funciona perfecto. Muchas gracias.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>