Pregunta Redirigir, cambiar URL o redireccionar HTTP a HTTPS en Apache: todo lo que siempre quiso saber sobre las reglas de Mod_Rewrite, pero tenía miedo de preguntar


Esto es un Pregunta canónica sobre el mod_rewrite de Apache.

Cambiar una URL de solicitud o redirigir a los usuarios a una URL diferente a la que originalmente solicitaron se realiza mediante mod_rewrite. Esto incluye cosas tales como:

  • Cambio de HTTP a HTTPS (o al revés)
  • Cambiar una solicitud a una página que ya no existe a un nuevo reemplazo.
  • Modificación de un formato de URL (como? Id = 3433 a / id / 3433)
  • Presentar una página diferente basada en el navegador, basada en el referente, basada en cualquier cosa posible bajo la luna y el sol.
  • Cualquier cosa que quieras meterte con la URL

¡Todo lo que siempre quiso saber sobre las reglas de Mod_Rewrite pero tenía miedo de preguntar!

¿Cómo puedo convertirme en un experto en escribir reglas mod_rewrite?

  • ¿Cuál es el formato y la estructura fundamentales de las reglas mod_rewrite?
  • ¿De qué forma / sabor de las expresiones regulares necesito tener una comprensión sólida?
  • ¿Cuáles son los errores / fallas más comunes al escribir reglas de reescritura?
  • ¿Cuál es un buen método para probar y verificar reglas mod_rewrite?
  • ¿Hay SEO o implicaciones de rendimiento de las reglas mod_rewrite que debo tener en cuenta?
  • ¿Hay situaciones comunes en las que mod_rewrite puede parecer la herramienta adecuada para el trabajo pero no lo es?
  • ¿Cuáles son algunos ejemplos comunes?

Un lugar para poner a prueba tus reglas.

los probador htaccess El sitio web es un gran lugar para jugar con sus reglas y probarlas. Incluso muestra la salida de depuración para que pueda ver qué coincidencia y qué no.


257
2017-12-20 16:59


origen


La idea detrás de esta pregunta es dar una ruta cercana a todas las interminables preguntas mod_rewrite que vuelven locos a nuestros usuarios más regulares. Esto es muy similar a lo que se hizo con la división en subredes en serverfault.com/questions/49765/how-does-subnetting-work . - Kyle Brandt♦
Además, realmente no quiero demasiados votos en esto pregunta, más bien deberían ir a la respuesta. No quiero hacer CW porque quiero asegurarme de que el afiche obtenga todo el crédito por lo que espero sea el Respuesta mod_rewrite para terminar todas las preguntas mod_rewrite. - Kyle Brandt♦
Lo siento, he votado la pregunta. ;-) Realmente creo que debe aparecer en (o cerca de) la parte superior de mod-rewrite etiquetas de búsqueda / filtros. - Steven Monday
Alguien más (tm) debe manejar los casos de uso comunes. No los conozco lo suficiente como para hacerle justicia. - sysadmin1138♦
Quizás esta pregunta debería vincularse a la etiqueta wiki mod-rewrite para acortar aún más la ruta. - beldaz


Respuestas:


orden de sintaxis mod_rewrite

mod_rewrite tiene algunas reglas de ordenamiento específicas que afectan el procesamiento. Antes de que se haga algo, el RewriteEngine On Se debe dar una directiva ya que esto activa el procesamiento mod_rewrite. Esto debe ser antes de cualquier otra directiva de reescritura.

RewriteCond anterior RewriteRule hace que UNA regla esté sujeta a lo condicional. Las siguientes RewriteRules se procesarán como si no estuvieran sujetas a condiciones.

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html

En este sencillo caso, si la referencia HTTP es de serverfault.com, redirigir las solicitudes de blog a páginas especiales de serverfault (solo somos ese especial). Sin embargo, si el bloque anterior tenía una línea RewriteRule adicional:

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html
RewriteRule $/blog/(.*)\.jpg         $/blog/$1.sf.jpg

Todos los archivos .jpg irían a las páginas especiales de serverfault, no solo a los que tienen una referencia indicando que venían de aquí. Esto claramente no es la intención de cómo se escriben estas reglas. Se podría hacer con múltiples reglas de RewriteCond:

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

Pero probablemente debería hacerse con una sintaxis de reemplazo más complicada.

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

La RewriteRule más compleja contiene los condicionales para su procesamiento. El último paréntesis, (html|jpg) le dice a RewriteRule que coincida para cualquiera html o jpg, y para representar la cadena coincidente como $ 2 en la cadena reescrita. Esto es lógicamente idéntico al bloque anterior, con dos pares RewriteCond / RewriteRule, solo lo hace en dos líneas en lugar de cuatro.

Las líneas múltiples de RewriteCond están ANDed implícitamente, y pueden ser ORed explícitamente. Para manejar las referencias de ServerFault y Super User (OR explícito):

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)    [OR]
RewriteCond %{HTTP_REFERER}                ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

Para servir las páginas referidas de ServerFault con navegadores Chrome (AND implícito):

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteCond %{HTTP_USER_AGENT}             ^Mozilla.*Chrome.*$
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

RewriteBase También es orden específico, ya que especifica cómo lo siguiente RewriteRule Las directivas se encargan de su tramitación. Es muy útil en archivos .htaccess. Si se usa, debe ser la primera directiva bajo "RewriteEngine on" en un archivo .htaccess. Tomemos este ejemplo:

RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

Esto le dice a mod_rewrite que esta URL en particular que está manejando actualmente fue recibida por medio de http://example.com/blog/ en lugar de la ruta del directorio físico (/ home / $ Username / public_html / blog) y tratarla en consecuencia. Debido a esto, el RewriteRule considera que es string-start después del "/ blog" en la URL. Aquí está la misma cosa escrita de dos maneras diferentes. Uno con RewriteBase, el otro sin:

RewriteEngine On

##Example 1: No RewriteBase##
RewriteCond %{HTTP_REFERER}                                   ^https?://serverfault\.com(/|$)
RewriteRule /home/assdr/public_html/blog/(.*)\.(html|jpg)     $1.sf.$2

##Example 2: With RewriteBase##
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

Como puedes ver, RewriteBase permite reescribir las reglas para aprovechar la websitio camino al contenido en lugar de la webservidor, lo que puede hacerlos más inteligibles para quienes editan dichos archivos. Además, pueden acortar las directivas, lo que tiene un atractivo estético.


Sintaxis de RewriteRule

RewriteRule tiene una sintaxis compleja para hacer coincidir cadenas. Cubriré las banderas (cosas como [PT]) en otra sección. Porque los administradores de sistemas aprenden con el ejemplo más a menudo que leyendo un página de manual Daré ejemplos y explicaré lo que hacen.

RewriteRule ^/blog/(.*)$    /newblog/$1

los .* la construcción coincide con cualquier carácter único (.) cero o más veces (*). Encerrarlo entre paréntesis le indica que proporcione la cadena que coincidió con la variable $ 1.

RewriteRule ^/blog/.*/(.*)$  /newblog/$1

En este caso, el primer. * NO se incluyó en parens, por lo que no se proporcionó a la cadena reescrita. Esta regla elimina un nivel de directorio en el nuevo sitio de blog. (/blog/2009/sample.html se convierte en /newblog/sample.html).

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$2

En este caso, la primera expresión de paréntesis configura un grupo coincidente. Esto se convierte en $ 1, que no es necesario y, por lo tanto, no se utiliza en la cadena reescrita.

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$1/$2

En este caso, usamos $ 1 en la cadena reescrita.

RewriteRule ^/blog/(20[0-9][0-9])/(.*)$   /newblog/$1/$2

Esta regla utiliza una sintaxis de corchete especial que especifica un carácter distancia. [0-9] coincide con los números del 0 al 9. Esta regla específica manejará los años del 2000 al 2099.

RewriteRule ^/blog/(20[0-9]{2})/(.*)$  /newblog/$1/$2

Esto hace lo mismo que la regla anterior, pero la parte {2} le dice que coincida con el carácter anterior (una expresión de corchete en este caso) dos veces.

RewriteRule ^/blog/([0-9]{4})/([a-z]*)\.html   /newblog/$1/$2.shtml

Este caso coincidirá con cualquier letra minúscula en la segunda expresión coincidente, y lo hará para tantos caracteres como sea posible. los \. construct le dice que trate el período como un período real, no el carácter especial que es en los ejemplos anteriores. Sin embargo, se romperá si el nombre del archivo tiene guiones.

RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html  /newblog/$1/$2.shtml

Esto atrapa los nombres de archivo con guiones en ellos. Sin embargo, como - es un carácter especial en expresiones de corchete, tiene que ser el primero Personaje en la expresión.

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

Esta versión atrapa cualquier nombre de archivo con letras, números o - Carácter en el nombre del archivo. Así es como se especifican conjuntos de caracteres múltiples en una expresión de corchete.


Banderas de RewriteRule

Las banderas en las reglas de reescritura tienen una gran cantidad de significados especiales y casos de uso..

RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html  /newblog/$1/$2.shtml  [L]

La bandera es la [L] al final de la expresión anterior. Se pueden usar múltiples banderas, separadas por una coma. La documentación vinculada describe cada uno, pero aquí están de todos modos:

L = Último. Deja de procesar RewriteRules una vez que este coincida. ¡La orden cuenta!
do = Cadena. Continuar procesando la siguiente RewriteRule. Si esta regla no coincide, entonces la siguiente regla no se ejecutará. Más sobre esto más adelante.
mi = Establecer variable ambiental. Apache tiene varias variables de entorno que pueden afectar el comportamiento del servidor web.
F = Prohibido. Devuelve un error 403-Forbidden si esta regla coincide.
sol = Se fue Devuelve un error 410-Gone si esta regla coincide.
H = Controlador. Obliga a que la solicitud se maneje como si fuera el tipo MIME especificado.
norte = Siguiente. Obliga a la regla a comenzar de nuevo y volver a coincidir. ¡TEN CUIDADO! Los bucles pueden resultar.
CAROLINA DEL NORTE = No hay caso. Permite jpg para que coincida con jpg y JPG.
Nebraska = No hay escape. Evita la reescritura de caracteres especiales (.? # & Etc) en sus equivalentes de código hexadecimal.
NS = No hay solicitudes secundarias. Si está utilizando el servidor incluye, esto evitará coincidencias con los archivos incluidos.
PAG = Proxy. Obliga a que la regla sea manejada por mod_proxy. Proporcione contenido de forma transparente desde otros servidores, porque su servidor web lo recupera y lo vuelve a servir. Este es un indicador peligroso, ya que uno mal escrito convertirá su servidor web en un proxy abierto y Eso es malo.
PT = Pasar a través. Tenga en cuenta las declaraciones de alias en la coincidencia de RewriteRule.
QSA = QSAppend. Cuando la cadena original contiene una consulta (http://example.com/thing?asp=foo) anexar la cadena de consulta original a la cadena reescrita. Normalmente sería desechado. Importante para el contenido dinámico.
R = Redirigir. Proporcionar un redireccionamiento HTTP a la URL especificada. También puede proporcionar código de redirección exacto [R = 303]. Muy parecido a RedirectMatch, que es más rápido y debe utilizarse cuando sea posible.
S = Saltar. Salta esta regla.
T = Tipo. Especifique el tipo mime del contenido devuelto. Muy similar a la AddType directiva.

Ya sabes como dije eso RewriteCond se aplica a una y solo una regla? Bueno, puedes sortear eso encadenando.

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html     [C]
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

Debido a que la primera RewriteRule tiene el indicador de Cadena, la segunda regla de reescritura se ejecutará cuando la primera sí lo haga, que es cuando la regla RewriteCond anterior coincide. Práctico si las expresiones regulares de Apache hacen que tu cerebro duela. Sin embargo, el método de todo en una línea al que apunto en la primera sección es más rápido desde el punto de vista de la optimización.

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

Esto puede hacerse más simple a través de banderas:

RewriteRule ^/blog/([0-9]{4})/([-0-9a-z]*)\.html   /newblog/$1/$2.shtml   [NC]

Además, algunas banderas también se aplican a RewriteCond. En particular, NoCase.

RewriteCond %{HTTP_REFERER}        ^https?://serverfault\.com(/|$)     [NC]

Coincidirá con "ServerFault.com"


219
2017-12-20 17:44



Bien hecho. [relleno] - EEAA
Muy agradable mod_rewrite y regex primer. +1. - Steven Monday
A veces es útil saber que la RewriteCond se procesa realmente después la RewriteRule es emparejado Es posible que desee decir "más sobre eso más adelante" cerca de la parte superior donde dice "RewriteCond precediendo a RewriteRule hace que UNA regla esté sujeta al condicional". Es posible que desee mencionar que las expresiones regulares son expresiones regulares compatibles con Perl. También tiene un apóstrofe extraño en "... la RewriteRule considera que es un inicio de cadena ..." - Dennis Williamson
RewriteRule ^/blog/.*/(.*)$ /newblog/$1 No coincide con el primero Componente de directorio: rewriterules son codiciosos de forma predeterminada. /.*/(.*) coincide con / 1 / (2) / y / 1/2/3/4/5 / (6) /, por lo que necesita / [^ /] * / para coincidir solo con la ruta FIRST componente. - adaptr
@ sysadmin1138, creo que esta respuesta es buena, pero puede ser mejor si elabora más sobre las banderas E, N, NS, P, PT y S con ejemplos porque esas banderas no son obvias como funcionan, etc. - Pacerier


¿Cuál es el formato fundamental y   estructura de las reglas mod_rewrite?

Me referiré a la excelente respuesta de sysadmin1138 sobre estos puntos.

Qué forma / sabor de regular   ¿Necesito tener expresiones sólidas   ¿comprensión de?

Además del orden de sintaxis, la coincidencia de sintaxis / expresiones regulares y los indicadores RewriteRule descritos por sysadmin1138, creo que vale la pena mencionar que mod_rewrite expone las variables de entorno de Apache en función de los encabezados de solicitud HTTP y la configuración de Apache.

yo recomendaria Tutorial de Debug de AskApache's mod_rewrite para una lista completa de variables que pueden estar disponibles para mod_rewrite.

¿Cuáles son las más comunes?   errores / trampas al escribir reescribir   ¿reglas?

La mayoría de los problemas con RewriteRule se derivan de un malentendido de la sintaxis / falla de PCRE para escapar adecuadamente de los caracteres especiales o una falta de información sobre el contenido de las variables utilizadas para la comparación.

Problemas típicos y resolución de problemas recomendados:

  • Error interno de servidor 500 - Quitar los controles de carro de Windows en los archivos de configuración, si están presentes, asegúrese de que mod_rewrite esté habilitado (ajuste las directivas en IfModule condicional para evitar este escenario), verifique la sintaxis de las directivas, comente las directivas hasta que se identifique el problema
  • Lazo de redireccionamiento - Utilice RewriteLog y RewriteLogLevel, comente las directivas hasta que se identifique el problema

¿Qué es un buen método para la prueba y   ¿Verificando las reglas de mod_rewrite?

En primer lugar, observe el contenido de las variables de entorno con las que planea coincidir: si tiene instalado PHP, esto es tan simple como agregar el siguiente bloque a su aplicación:

<?php
  var_dump($_SERVER);
?>

... luego escriba sus reglas (preferiblemente para probar en un servidor de desarrollo) y anote cualquier coincidencia o actividad inconsistente en su Apache Registro de errores expediente.

Para reglas más complejas, use mod_rewrite's RewriteLog directiva para registrar la actividad en un archivo y establecer RewriteLogLevel 3

¿Hay SEO o rendimiento?   implicaciones de las reglas mod_rewrite I   debe ser consciente de?

AllowOverride all Afecta el rendimiento del servidor ya que Apache debe verificar .htaccess archivos y directivas de análisis con cada solicitud: si es posible, mantenga todas las directivas en la configuración de VirtualHost para su sitio o habilite .htaccess reemplaza solo para los directorios que los necesitan.

De Google Pautas para webmasters declare explícitamente: "No engañe a sus usuarios ni presente contenido diferente a los motores de búsqueda de lo que usted muestra a los usuarios, lo que comúnmente se conoce como" encubrimiento ". Evite crear directivas mod_rewrite que filtran los robots de los motores de búsqueda.

Los robots de los motores de búsqueda prefieren un contenido 1: 1: asignación de URI (esta es la base para clasificar los enlaces al contenido): si está usando mod_rewrite para crear redirecciones temporales o si está sirviendo el mismo contenido bajo múltiples URI, considere la posibilidad de especificar un URI canónica dentro de sus documentos HTML.

¿Hay situaciones comunes donde   mod_rewrite puede parecer el derecho   herramienta para el trabajo pero no es?

Este es un tema enorme (y potencialmente contencioso) en sí mismo; es mejor (IMHO) tratar los usos caso por caso y permitir que los solicitantes determinen si las resoluciones sugeridas son adecuadas para sus necesidades.

¿Cuáles son algunos ejemplos comunes?

Trucos y consejos de AskApache's mod_rewrite cubre casi todos los casos de uso comunes que aparecen con regularidad, sin embargo, la solución "correcta" para un usuario determinado puede depender de la sofisticación de la configuración del usuario y las directivas existentes (por lo que es generalmente una buena idea ver cuál otro directivas que un usuario tiene en su lugar cada vez que surge una pregunta mod_rewrite).


38
2017-12-21 01:00



Gracias por el enlace AskApache. ¡Es lo que estaba buscando! - sica07
El payaso AskApache no es oficialmente compatible con el ASF. Mucho de lo que dice es discutible o simplemente erróneo. - adaptr
@adaptr Por favor, comparta los recursos superiores de los que aparentemente está al tanto. - danlefree
"situaciones comunes donde mod_rewrite puede parecer la herramienta adecuada para el trabajo, pero no lo es?" - sencillo redirecciones, donde mod_rewrite no se está utilizando ya. Usar mod_alias Redirect o RedirectMatch en lugar. Véase también la documentación de Apache: Cuando no usar mod_rewrite - MrWhite


Como muchos administradores / desarrolladores, he estado luchando contra las complejidades de las reglas de reescritura durante años y no estoy contento con la documentación existente de Apache, así que decidí como un proyecto personal llegar al fondo de cómo mod_rewrite realmente funciona e interactúa con el resto del núcleo de Apache, así que durante los últimos meses he estado instrumentando casos de prueba con strace + profundizando en el código fuente para controlar todo esto.

Aquí hay algunos comentarios clave que los desarrolladores de reglas de reescritura deben tener en cuenta:

  • Algunos aspectos de la reescritura son comunes a la configuración del servidor, el host virtual, el directorio, el procesamiento de .htaccess sin embargo
  • Algunos procesos son muy diferentes para la configuración de la raíz (configuración del servidor, servidor virtual y directorio) a diferencia del PerDir (.htaccess) procesamiento.
  • Peor aún, ya que el procesamiento PerDir puede desencadenar casi indiscriminadamente el ciclo INTERNIR REDIRECT, los elementos de configuración de la raíz deben estar informados de que dicho procesamiento PerDir puede desencadenar esto.

Me atrevería a decir que, debido a esto, casi es necesario dividir las comunidades de usuarios de reescritura en dos categorías y tratarlas como completamente separadas:

  • Aquellos con acceso de root a la configuración de Apache. Estos son típicamente administradores / desarrolladores con una aplicación dedicada de servidor / VM, y el mensaje aquí es bastante simple: evite usar .htaccess archivos si es posible; haz todo en tu servidor o vhost config. La depuración es bastante fácil ya que el desarrollador puede configurar la depuración y tiene acceso a los archivos rewrite.log.

  • Usuarios de un servicio alojado compartido (SHS).

    • Tales usuarios tener usar .htaccess / Perdir el procesamiento ya que no hay alternativa disponible.
    • Peor aún, el nivel de habilidad de tales usuarios (en lo que respecta al uso de la lógica de escalera manejada por expresiones regulares de mod_rewrite) generalmente es significativamente menor que los administradores experimentados.
    • Apache y los proveedores de alojamiento no ofrecen soporte de diagnóstico / depuración. La única información de diagnóstico es una redirección exitosa, una redirección a la URI incorrecta. o un código de estado 404/500. Esto los deja confundidos e indefensos.
    • Apache es extremadamente débil al explicar cómo funciona la reescritura para este caso de uso. Por ejemplo, no proporciona una explicación clara de lo que PerDir .htaccessarchivo está seleccionado y por qué. No explica las complejidades del ciclo PerDir y cómo evitar esto.

Posiblemente hay una tercera comunidad: personal administrativo y de apoyo en los proveedores de SHS que terminan con un pie en ambos campos y tienen que sufrir las consecuencias de lo anterior.

He escrito un par de publicaciones de blog al estilo de un artículo (por ejemplo, Más sobre el uso de reglas de reescritura en archivos .htaccess) que cubre muchos puntos detallados que no repetiré aquí para abreviar esta publicación. Tengo mi propio servicio compartido y también apoyo algunos proyectos dedicados y VM FLOSS. Comencé a usar una máquina virtual LAMP estándar como vehículo de prueba para mi cuenta SHS, pero al final me pareció mejor hacer una máquina virtual espejo adecuada (descrito aquí).

Sin embargo, en términos de cómo la comunidad de administradores debe apoyar .htaccess Usuarios, creo que necesitamos desarrollar y ofrecer:

  • Una descripción coherente de cómo funciona realmente el sistema de reescritura en el procesamiento PerDir
  • Un conjunto de pautas / mejores prácticas sobre cómo escribir .htaccess reescribir reglas
  • Un simple analizador de secuencias de comandos de reescritura basado en la web similar al analizador html de W3C, pero mediante el cual los usuarios pueden ingresar URI de prueba o vectores de prueba del mismo y obtener un registro inmediato del flujo lógico de reescritura
  • Sugerencias sobre cómo obtener diagnósticos incorporados de sus reglas (por ejemplo,

    • Utilizar [E=VAR:EXPR] explotando el hecho de que EXPR expandirá las referencias ($ N o% N) para que estén disponibles como diagnóstico para el script de destino.
    • Si ordena de forma tópica sus reglas de reescritura con los indicadores [OR], [C], [SKIP] y [L] para que funcione todo el esquema de reescritura sin Si es necesario explotar la redirección interna, puede agregar lo siguiente como regla 1 para evitar todos los problemas de bucle:

      RewriteCond %{ENV:REDIRECT_STATUS} !=""
      RewriteRule .  -  [L]
      

21
2018-01-14 16:50



Esto está bien documentado. ¿Por qué dices que la documentación no explica esto? - adaptr
Todo lo que tienes que hacer es suscribirte a la .htaccess Temas y ya verás. La mayoría de los principiantes se confunden irremediablemente; la mayoría de ellos tienen su primera experiencia con un servicio LAMP y mod_rewrite en un servicio compartido y, por lo tanto, no tienen acceso de root a las configuraciones de sistema / vhost y tienen que usar el procesamiento por directorio a través de .htaccessarchivos. Hay diferencias importantes que el principiante tiene que "desangrar". Me consideraría un usuario avanzado y todavía estoy descubriendo sutilezas. Como dije, tuve que usar el escaneo de strace y el código fuente para resolver algunos aspectos. No debería ser necesario. :-( - TerryE
Estoy totalmente de acuerdo. "Necesitamos dividir las comunidades de usuarios de reescritura en dos categorías y tratarlas como completamente separadas". Algunos usuarios están usando hosting compartido y necesitar confiar en .htaccess, que es terriblemente frágil, complicado y confuso, incluso para los expertos. Todavía estoy teniendo problemas. - Ryan


Utilizando rewritemap

Hay muchas cosas que puedes hacer con los mapas de reescritura. Los Rewritemaps se declaran utilizando la directiva Rewritemap, y luego se pueden usar tanto en las evaluaciones de RewritCond como en las Subsiciones de RewriteRule.

La sintaxis general para RewriteMap es:

RewriteMap MapName MapType:MapSource

Por ejemplo:

RewriteMap examplemap txt:/path/to/file/map.txt

Luego puedes usar el nombre del mapa para construcciones como esta:

${examplemap:key}

El mapa contiene pares clave / valor. Si se encuentra la clave, se sustituye el valor. Los mapas simples son solo archivos de texto simple, pero puede usar mapas hash e incluso consultas SQL. Más detalles están en la documentación:

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap

Cuerdas sin escape.

Hay cuatro mapas internos que puedes usar para hacer algunas manipulaciones. Especialmente las cadenas que no escapan pueden ser útiles.

Por ejemplo: quiero probar la cadena "café" en la cadena de consulta. Sin embargo, el navegador se escapará de esto antes de enviarlo a mi servidor, así que tendré que averiguar cuál es la versión de la URL que se escapó para cada cadena que deseo hacer coincidir, o simplemente puedo desbloquearla ...

RewriteMap unescape int:unescape

RewriteCond %{QUERY_STRING}  (location|place)=(.*)
RewriteCond ${unescape:%2}   café
RewriteRule ^/find/$         /find/1234? [L,R]

Observe cómo uso un RewriteCond para capturar el argumento y el parámetro de cadena de consulta, y luego usar el mapa en el segundo rewriteCond para deseleccionarlo. Esto entonces se compara. También tenga en cuenta que necesito que usemos% 2 como clave en el mapa de reescritura, ya que% 1 contendrá "ubicación" o "lugar". Cuando use paréntesis para agrupar patrones, también se capturarán, si planea usar el resultado de la captura o no ...


15
2018-04-06 11:57



La última frase no es del todo cierta. los mod_rewrite el motor de expresiones regulares soporta grupos no capturadores tales como (?:location|place) y esto solo tendrá una captura en el ejemplo. - TerryE


¿Cuáles son las más comunes?   errores / trampas al escribir reescribir   ¿reglas?

Un error realmente fácil es cuando reescribes las URL que alteran la ruta aparente, por ejemplo. desde /base/1234/index.html a /base/script.php?id=1234. El cliente no encontrará ninguna imagen o CSS con rutas relativas a la ubicación del script. Una serie de opciones para resolver esto se pueden encontrar en esta faq.


12
2018-01-01 04:02



Gracias por el enlace. Particularmente cuando se trabaja con otros miembros del equipo que no están familiarizados con la reescritura, encuentro que agregar un <base> La etiqueta es más fácil de seguir y aún así habilita las rutas relativas. - kontur