| <?xml version='1.0' encoding='UTF-8' ?> | |
| <!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd"> | |
| <?xml-stylesheet type="text/xsl" href="../style/manual.es.xsl"?> | |
| <!-- English Revision: 1933438:1935430 (outdated) --> | |
| <!-- | |
| Licensed to the Apache Software Foundation (ASF) under one or more | |
| contributor license agreements. See the NOTICE file distributed with | |
| this work for additional information regarding copyright ownership. | |
| The ASF licenses this file to You under the Apache License, Version 2.0 | |
| (the "License"); you may not use this file except in compliance with | |
| the License. You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| See the License for the specific language governing permissions and | |
| limitations under the License. | |
| --> | |
| <manualpage metafile="tech.xml.meta"> | |
| <parentdocument href="./">Rewrite</parentdocument> | |
| <title>Detalles Técnicos de Apache mod_rewrite</title> | |
| <summary> | |
| <p>Este documento discute algunos de los detalles técnicos de <module>mod_rewrite</module> | |
| y la coincidencia de URLs.</p> | |
| </summary> | |
| <seealso><a href="../mod/mod_rewrite.html">Documentación del módulo</a></seealso> | |
| <seealso><a href="intro.html">Introducción a mod_rewrite</a></seealso> | |
| <seealso><a href="remapping.html">Redirección y remapeo</a></seealso> | |
| <seealso><a href="access.html">Control de acceso</a></seealso> | |
| <seealso><a href="vhosts.html">Hosts virtuales</a></seealso> | |
| <seealso><a href="proxy.html">Proxy</a></seealso> | |
| <seealso><a href="rewritemap.html">Uso de RewriteMap</a></seealso> | |
| <seealso><a href="advanced.html">Técnicas avanzadas</a></seealso> | |
| <seealso><a href="avoid.html">Cuándo no usar mod_rewrite</a></seealso> | |
| <section id="InternalAPI"><title>Fases de la API</title> | |
| <p>Apache HTTP Server maneja las solicitudes en varias fases. En | |
| cada una de estas fases, uno o más módulos pueden ser llamados para | |
| manejar esa porción del ciclo de vida de la solicitud. Las fases incluyen cosas | |
| como traducción de URL a nombre de archivo, autenticación, autorización, | |
| contenido, y registro. (Esta no es una lista exhaustiva.)</p> | |
| <p><module>mod_rewrite</module> actúa en dos de estas fases (o "hooks", como se les | |
| suele llamar) para influir en cómo las URLs pueden ser reescritas.</p> | |
| <p>Primero, usa el hook de traducción de URL a nombre de archivo, que ocurre | |
| después de que la solicitud HTTP ha sido leída, pero antes de que cualquier autorización | |
| comience. Segundo, usa el hook de Fixup, que es después de las | |
| fases de autorización, y después de que los archivos de configuración per-directorio | |
| (archivos <code>.htaccess</code>) han sido leídos, pero antes de que el | |
| manejador de contenido sea llamado.</p> | |
| <p>Después de que una solicitud llega y se ha determinado un servidor o | |
| host virtual correspondiente, el motor de reescritura comienza a | |
| procesar cualquier directiva de <module>mod_rewrite</module> que aparezca en la | |
| configuración per-servidor. (es decir, en el archivo de configuración principal del servidor | |
| y secciones <directive module="core" type="section">Virtualhost</directive>.) | |
| Esto sucede en la fase de traducción de URL a nombre de archivo.</p> | |
| <p>Unos pasos más tarde, una vez que se han encontrado los directorios de datos finales, | |
| se aplican las directivas de configuración per-directorio (archivos <code>.htaccess</code> | |
| y bloques <directive module="core" | |
| type="section">Directory</directive>). Esto | |
| sucede en la fase de Fixup.</p> | |
| <p>En cada uno de estos casos, <module>mod_rewrite</module> reescribe el | |
| <code>REQUEST_URI</code> ya sea a una nueva URL, o a un nombre de archivo.</p> | |
| <p>En contexto per-directorio (es decir, dentro de archivos <code>.htaccess</code> | |
| y bloques <code>Directory</code>), estas reglas se están aplicando | |
| después de que una URL ya ha sido traducida a un nombre de archivo. Debido a | |
| esto, la ruta URL contra la que <module>mod_rewrite</module> inicialmente compara las directivas | |
| <directive module="mod_rewrite">RewriteRule</directive> | |
| es la ruta completa del sistema de archivos al nombre de archivo traducido con la ruta del | |
| directorio actual (incluyendo una barra final) eliminada del frente.</p> | |
| <p>Para ilustrar: Si las reglas están en /var/www/foo/.htaccess y se está procesando una solicitud | |
| para /foo/bar/baz, una expresión como ^bar/baz$ coincidiría.</p> | |
| <p>Si se hace una sustitución en contexto per-directorio, se emite una nueva | |
| sub-solicitud interna con la nueva URL, que reinicia el procesamiento de las | |
| fases de la solicitud. Si la sustitución es una ruta relativa, la directiva <directive | |
| module="mod_rewrite">RewriteBase</directive> | |
| determina el prefijo de ruta URL que se antepone a la sustitución. | |
| En contexto per-directorio, se debe tener cuidado de | |
| crear reglas que eventualmente (en alguna "ronda" futura de procesamiento de reescritura | |
| per-directorio) no realicen una sustitución para evitar bucles. | |
| (Vea <a href="https://cwiki.apache.org/confluence/display/httpd/RewriteLooping">RewriteLooping</a> | |
| para más discusión de este problema.)</p> | |
| <p>Debido a esta manipulación adicional de la URL en contexto per-directorio, | |
| necesitará tener cuidado de crear sus reglas de reescritura | |
| de manera diferente en ese contexto. En particular, recuerde que la | |
| ruta de directorio principal se eliminará de la URL que sus | |
| reglas de reescritura verán. Considere los ejemplos siguientes para más | |
| clarificación.</p> | |
| <table border="1"> | |
| <tr> | |
| <th>Ubicación de la regla</th> | |
| <th>Regla</th> | |
| </tr> | |
| <tr> | |
| <td>Sección VirtualHost</td> | |
| <td>RewriteRule "^/images/(.+)\.jpg" "/images/$1.gif"</td> | |
| </tr> | |
| <tr> | |
| <td>Archivo .htaccess en la raíz del documento</td> | |
| <td>RewriteRule "^images/(.+)\.jpg" "images/$1.gif"</td> | |
| </tr> | |
| <tr> | |
| <td>Archivo .htaccess en el directorio images</td> | |
| <td>RewriteRule "^(.+)\.jpg" "$1.gif"</td> | |
| </tr> | |
| </table> | |
| <p>Para aún más información sobre cómo <module>mod_rewrite</module> manipula URLs en | |
| diferentes contextos, debería consultar las <a | |
| href="../mod/mod_rewrite.html#logging">entradas del log</a> realizadas durante | |
| la reescritura.</p> | |
| </section> | |
| <section id="InternalRuleset"><title>Procesamiento del Conjunto de Reglas</title> | |
| <p>Ahora cuando <module>mod_rewrite</module> se activa en estas dos fases de la API, lee | |
| los conjuntos de reglas configurados desde su estructura de | |
| configuración (que a su vez fue creada al inicio para | |
| contexto per-servidor o durante el recorrido de directorios del | |
| núcleo de Apache para contexto per-directorio). Entonces el motor de reescritura | |
| de URLs se inicia con el conjunto de reglas contenido (una o más | |
| reglas junto con sus condiciones). La operación del | |
| motor de reescritura de URLs es exactamente la misma para ambos | |
| contextos de configuración. Solo el procesamiento del resultado final es | |
| diferente.</p> | |
| <p>El orden de las reglas en el conjunto de reglas es importante porque el | |
| motor de reescritura las procesa en un orden especial (y no muy | |
| obvio). La regla es esta: El motor de reescritura recorre | |
| el conjunto de reglas regla por regla (directivas | |
| <directive module="mod_rewrite">RewriteRule</directive>) y | |
| cuando una regla particular coincide, opcionalmente recorre | |
| las condiciones correspondientes existentes (directivas <code>RewriteCond</code>). | |
| Por razones históricas las condiciones se dan | |
| primero, y por lo tanto el flujo de control es un poco | |
| enrevesado. Vea la Figura 1 para más detalles.</p> | |
| <p class="figure"> | |
| <img src="../images/rewrite_process_uri.png" | |
| alt="Flujo de coincidencia de RewriteRule y RewriteCond" /><br /> | |
| <dfn>Figura 1:</dfn>El flujo de control a través del conjunto de reglas de reescritura | |
| </p> | |
| <p>Primero la URL se compara contra el | |
| <em>Pattern</em> de cada regla. Si falla, <module>mod_rewrite</module> | |
| inmediatamente deja de procesar esta regla, y continúa con la | |
| siguiente regla. Si el <em>Pattern</em> coincide, <module>mod_rewrite</module> busca | |
| las condiciones de regla correspondientes (directivas RewriteCond, | |
| que aparecen inmediatamente encima de la RewriteRule en la configuración). | |
| Si no hay ninguna, sustituye la URL con un nuevo valor, que se | |
| construye a partir de la cadena <em>Substitution</em>, y continúa | |
| con su bucle de reglas. Pero si existen condiciones, inicia un | |
| bucle interno para procesarlas en el orden en que están | |
| listadas. Para las condiciones, la lógica es diferente: no comparamos | |
| un patrón contra la URL actual. En su lugar, primero creamos una | |
| cadena <em>TestString</em> expandiendo variables, | |
| referencias inversas, búsquedas en mapas, <em>etc.</em> y luego intentamos | |
| comparar <em>CondPattern</em> contra ella. Si el patrón | |
| no coincide, el conjunto completo de condiciones y la | |
| regla correspondiente fallan. Si el patrón coincide, entonces se | |
| procesa la siguiente condición hasta que no haya más condiciones | |
| disponibles. Si todas las condiciones coinciden, el procesamiento continúa | |
| con la sustitución de la URL con | |
| <em>Substitution</em>.</p> | |
| </section> | |
| </manualpage> |