Bueno, pues resulta que tuve la necesidad de implementar un software de punto de venta para un pequeño negocio. Buscando en SourceForge llegué al sitio de una aplicación web llamada PHP Point of Sale (PHP Punto de venta), escrita como su nombre lo indica, en PHP y utiliza un framework llamado CodeIgniter. Como era la aplicación que mas se adecuaba a los requerimientos (principalmente facilidad y flexibilidad) entonces me di a la tarea de implementarla en mi computadora.
Bajé el archivo comprimido y seguí las instrucciones, las cuales son básicamente: crear la base de datos y configurar la aplicación para que se conecte con esa base de datos creada. Después de eso intenté hacer login y después el navegador arrojaba un error 404 (modificado por php, pero aún así un error 404). Entonces vi que el atributo action del formulario de login, enviaba la petición a “index.php/login”. Esto se me hizo muy raro ya que nunca había visto, en una url, una diagonal después del nombre del archivo que se solicita. Investigué mas sobre la aplicación y me enteré de que está hecha utilizando el enfoque Modelo-Vista-Controlador. Ya había leído artículos y entradas sobre este enfoque pero no había intentado instalar o desarrollar aplicaciones que utilicen este enfoque.
Después la instalé en un servidor Apache y todo funcionó bien (a la base de datos se le tienen que hacer cambios pero no es este el tema de la entrada) pero como siempre, me quedé con una sensación de derrota y después de algo de tiempo (después de que cambié la aplicación para que se viera y utilizara un poco mejor). Me di a a la tarea de leer sobre MVC y Reescritura de URL. Busqué por la web una manera para poner en marcha una aplicación hecha con CodeIgniter, pero no encontré utilizando el término de búsqueda “CodeIgniter en IIS 7.0 (por eso así se llama la entrada)”, entonces aquí me tienen escribiendo esto.
Bueno, pues ¿que se necesita para poner a funcionar el codeigniter en IIS 7.0, de modo que el IIS acepte las direcciones del tipo “index.php/algo”?. Pueden seguir los siguientes pasos:
- Descargar el codeIgniter y seguir las instrucciones de instalación
- Instalar el módulo URL Rewrite de IIS, la instalación es muy sencilla, puede hacerse desde el web platform installer o desde los msi que pueden descargar aqui.
-
Abrir el Administrador de IIS, expandir la lista de sitios y entrar a la carpeta donde descomprimieron el codeigniter. Después de eso abrir el módulo “Reescritura de dirección URL”.
-
Ahora si, viene lo bueno. Lo que hace el módulo URL Rewrite es “cambiar” las direcciones url entrantes, realizar la petición con el cambio realizado y regresar el html generado por la página cambiada, todo esto sin que el usuario lo sepa ya que el módulo no redirige.
Para que todo esto trabaje, al módulo primero se le dice que direcciones vamos a cambiar, luego bajo que condiciones y por último a donde lo vamos a mandar.
En la vista de Reescritura de Redirección URL en la solapa de Acciones, seleccionar “Agregar Reglas”.
Primero debemos indicar que páginas van a ser las “reescritas”. En mi caso, yo quería que todas las que empezaran en index.php. Entonces en la caja de texto patrón puse ^index.php/(.*)$. De esta manera el módulo parte la URL en dos, como muestra la imagen.
Las condiciones pueden dejarse vacías. Pero es recomendable añadir dos para controlar que las páginas solicitadas no sean un archivo o una carpeta. Entonces se añade una condición pulsando el botón “Agregar”, en la ventana de “Agregar Condición” si se selecciona “No es un archivo”, la entrada de condición cambia automáticamente para referirse al “REQUEST_FILENAME”. Después añadir otra y seleccionar “No es una carpeta” para condicionar de que la URL no incluya una carpeta del sitio.
En acción debe dejarse la opción “Reescribir”. Y en la caja de Texto “Reescribir dirección URL” escribir “index.php?{R:1}”. Mmmm… ¿Que por qué se escribe eso?. Ah pues porque si recuerdan, el patrón de entrada parte la url en dos y las etiqueta como {R:0} y {R:1}, y entonces {R:1} corresponde a la parte que está después del “index.php/”.
Por último se deben de aplicar los cambios de la regla. Así todas las peticiones de entrada que correspondan al tipo “index.php/algo/algo2″. Serán reescritas como index.php?algo/home. De manera que index.php procesará “algo\home” como el querystring e invocará el controlador correspondiente.
Si uno entra al web.config que se crea en la carpeta de la aplicación. Notará que se agregaron unas líneas.
<rule name="Rewrite Subdomain" stopProcessing="true">
<match url="^index.php/(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAny">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="index.php?{R:1}" appendQueryString="false" />
</rule>
Si ya sé, el código que pegué no se ve bien. Pero bueno, ahí se puede ver que la definición de “rule” incluye las tres partes que les mencionaba. Entrada (match), Condiciones (conditions) y salida (action).
- De forma opcional. También puede agregarse otra regla que tenga como patrón de entrada “.*” y que reescriba la dirección como “index.php?{R:0}”. De esta forma se pueden procesar las peticiones del tipo “controlador\accion”, sin que tenga que aparecer “index.php”.
Y ya. Pruebenlo en el navegador de su preferencia. Agregar reglas al URL Rewrite también les servirá para controlar otras aplicaciones que se encuentren en su servidor, incluyendo asp.net con WebForms.




Hola que tal, tengo el siguiente codigo para mostrar una lista de PDF’s pero cuando doy click en uno de ellos me manda el error:
Codigo:
$carpeta = ‘carpeta/’;
$nombre = ‘archivo.pdf’;
echo anchor(base_url().’views/archivos/factura/’.$carpeta.$nombre);
ERROR:
404 Page Not Found
The page you requested was not found.
tendria que agregar alguna expresion regular para poder mostrar los archivos PDF, de ser asi como seria la expresion regular?
A ver, lo que te entendí es que el código que pusiste es para mostrar un pdf, el cual está dentro de una función de un controlador.
Si es así, entonces lo que tienes que hacer es obtener la ruta del documento.
$carpeta = “/carpeta/”;
$nombre = “archivo.pdf”;
$documentoRuta = realpath(“”) . $carpeta . $nombre;
Luego mandas las cabeceras para indicar que el contenido es un pdf.
header(‘Content-Type: application/pdf’);
header(“Pragma: public”);
header(“Cache-Control: public”);
Luego lees el contenido del archivo y lo regresas como contenido.
ob_clean();
flush();
readfile($documentoRuta);
muchísimas gracias por tu post. Me acabas de salvar la vida. Llevaba 3 días peleado con un problema en el web.config y solo con leer el tuyo me ha entrado la inspiración y lo he resuelto