Muchos carteles tienen problemas para depurar sus declaraciones RewriteRule y RewriteCond dentro de sus .htaccess
archivos. La mayoría de estos están utilizando un servicio de alojamiento compartido y, por lo tanto, no tienen acceso a la configuración del servidor raíz. No pueden evitar el uso de .htaccess
archivos para reescribir y no pueden habilitar un RewriteLogLevel ", como sugieren muchos encuestados. Además, hay muchas .htaccess
dificultades y restricciones específicas que no se cubren bien. Configurar una pila LAMP de prueba local implica demasiada curva de aprendizaje para la mayoría .
Así que mi Q aquí es cómo se lo recomendamos que depurar sus reglas propias . Proporciono algunas sugerencias a continuación. Se agradecerán otras sugerencias.
Comprenda que el motor mod_rewrite recorre los
.htaccess
archivos . El motor ejecuta este bucle:do execute server and vhost rewrites (in the Apache Virtual Host Config) find the lowest "Per Dir" .htaccess file on the file path with rewrites enabled if found(.htaccess) execute .htaccess rewrites (in the user's directory) while rewrite occurred
Por lo tanto, sus reglas se ejecutarán repetidamente y si cambia la ruta de URI, puede terminar ejecutando otros
.htaccess
archivos si existen. Por lo tanto, asegúrese de terminar este ciclo, si es necesario agregando másRewriteCond
para detener el disparo de las reglas. Elimine también cualquier.htaccess
conjunto de reglas de reescritura de nivel inferior a menos que tenga la intención explícita de utilizar conjuntos de reglas de varios niveles.Asegúrese de que la sintaxis de cada Regexp sea correcta probando contra un conjunto de patrones de prueba para asegurarse de que sea una sintaxis válida y haga lo que pretende con un rango completo de URI de prueba. Vea la respuesta a continuación para más detalles.
Desarrolle sus reglas de forma incremental en un directorio de prueba. Puede utilizar la función "Ejecutar el
.htaccess
archivo más profundo en la ruta" para configurar un directorio de prueba (árbol) y conjuntos de reglas de depuración separados aquí sin arruinar sus reglas principales y dejar de funcionar su sitio. Debe agregarlos uno a la vez porque esta es la única forma de localizar fallas en las reglas individuales.Use un código auxiliar de script ficticio para volcar las variables de entorno y servidor . (Consulte el Listado 2 ) Si su aplicación usa, por ejemplo,
blog/index.php
puede copiar estotest/blog/index.php
y usarlo para probar las reglas de su blog en eltest
subdirectorio. También puede usar variables de entorno para asegurarse de que el motor de reescritura interprete las cadenas de sustitución correctamente, p. Ej.RewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]
y busque estas variables REDIRECT_ * en el volcado phpinfo. Por cierto, usé este y descubrí en mi sitio que tenía que usar
%{ENV:DOCUMENT_ROOT_REAL}
en su lugar. En el caso del redireccionamiento en bucle, las variables REDIRECT_REDIRECT_ * enumeran el pase anterior. Etc ..Asegúrese de que su navegador no lo muerda al almacenar en caché redirecciones 301 incorrectas . Ver la respuesta a continuación . Mi agradecimiento a Ulrich Palha por esto.
El motor de reescritura parece sensible a las reglas en cascada dentro de un
.htaccess
contexto, (ahí es donde seRewriteRule
produce una sustitución y esto recae en otras reglas), ya que encontré errores con solicitudes secundarias internas (1) y un procesamiento incorrecto de PATH_INFO que a menudo puede se evita mediante el uso de los indicadores [NS], [L] y [PT].
¿Algún comentario o sugerencia más?
Listado 1 - phpinfo
<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);
fuente
Respuestas:
Aquí hay algunos consejos adicionales sobre las reglas de prueba que pueden facilitar la depuración de los usuarios en hosting compartido
1. Use un agente de usuario falso
Al probar una nueva regla, agregue una condición para ejecutarla solo con un
fake
agente de usuario que usará para sus solicitudes. De esta manera, no afectará a nadie más en su sitio.p.ej
Si está usando Firefox, puede usar el User Agent Switcher para crear la cadena de agente de usuario falsa y probar.
2. No use 301 hasta que haya terminado las pruebas
He visto muchas publicaciones en las que la gente todavía está probando sus reglas y están usando 301. No lo hagas .
Si no está utilizando la sugerencia 1 en su sitio, no solo usted, sino cualquier persona que visite su sitio en ese momento se verá afectada por el 301.
Recuerde que son permanentes y su navegador los almacena en caché de forma agresiva. Use un 302 en su lugar hasta que esté seguro, luego cámbielo a 301.
3. Recuerde que los 301 se almacenan en caché agresivamente en su navegador
Si su regla no funciona y le parece correcta, y no estaba utilizando las sugerencias 1 y 2, vuelva a realizar la prueba después de borrar la memoria caché del navegador o mientras está en navegación privada.
4. Use una herramienta de captura HTTP
Use una herramienta de captura HTTP como Fiddler para ver el tráfico HTTP real entre su navegador y el servidor.
Mientras que otros podrían decir que usted
site does not look right
, en cambio, podría verlo e informarloall of the images, css and js are returning 404 errors
, reduciendo rápidamente el problema.Mientras que otros informarán que usted
started at URL A and ended at URL C
, podrá ver que comenzaron enURL A, were 302 redirected to URL B and 301 redirected to URL C
. Incluso si la URL C era el objetivo final, sabrá que esto es malo para el SEO y necesita ser reparado.Podrá ver los encabezados de caché que se configuraron en el lado del servidor, reproducir solicitudes, modificar encabezados de solicitud para probar ...
fuente
[L,R=302]
[L, R=302]
solo haga[L,R]
lo predeterminado302
Prueba de reescritura en línea .htaccess
Encontré esta ayuda de Google para RegEx, me ahorró mucho tiempo al tener que cargar nuevos
.htaccess
archivos cada vez que hago una pequeña modificación.desde el sitio:
fuente
No olvide que en los archivos .htaccess es una URL relativa que coincide.
En un archivo .htaccess, la siguiente RewriteRule nunca coincidirá:
fuente
/
, se elimina en cualquier parte delantera , pero esta eliminación no se produce para las cadenas de coincidencia ensambladas en los comandos Rewrite Cond .Asegúrese de que la sintaxis de cada Regexp sea correcta
probando contra un conjunto de patrones de prueba para asegurarse de que sea una sintaxis válida y que haga lo que pretende con un rango completo de URI de prueba.
Consulte regexpCheck.php a continuación para obtener un script simple que puede agregar a un directorio privado / test en su sitio para ayudarlo a hacer esto. He mantenido esto breve en lugar de bonito. Simplemente pasa esto a un archivo
regexpCheck.php
en un directorio de prueba para usarlo en tu sitio web. Esto lo ayudará a construir cualquier expresión regular y probarla contra una lista de casos de prueba mientras lo hace. Estoy usando el motor PHP PCRE aquí, pero después de haber examinado la fuente de Apache, esto es básicamente idéntico al que se usa en Apache. Hay muchos HowTos y tutoriales que proporcionan plantillas y pueden ayudarlo a desarrollar sus habilidades de expresión regular.Listado 1 - regexpCheck.php
fuente
import_request_variables
fue desaprobada en PHP 5.3 y eliminada en 5.4.extract($_GET)
junto conextract($_POST)
puede realizar la misma función, pero todas las variables necesitarían el prefijo eliminado de su nombre. Fuente: php.net/manual/en/function.import-request-variables.phpAsegúrese de usar el signo de porcentaje frente a las variables, no el signo de dólar.
Es
%{HTTP_HOST}
, no${HTTP_HOST}
. No habrá nada en el error_log, no habrá errores internos del servidor, su expresión regular sigue siendo correcta, la regla simplemente no coincidirá. Esto es realmente horrible si trabajas mucho con plantillas django / genshi y tienes${}
una sustitución variable en la memoria muscular.fuente
Uno de un par de horas que perdí:
Si ha aplicado todos estos consejos y solo está recibiendo 500 errores porque no tiene acceso al registro de errores del servidor, tal vez el problema no esté en .htaccess sino en los archivos a los que redirige.
Después de arreglar mi problema .htaccess, pasé dos horas más tratando de solucionarlo un poco más, a pesar de que simplemente me había olvidado de algunos permisos.
fuente
.htaccess
problema difícil .Establezca variables de entorno y use encabezados para recibirlas:
Puede crear nuevas variables de entorno con líneas RewriteRule, como lo menciona OP:
Pero si no puede hacer que funcione un script del lado del servidor, ¿cómo puede leer esta variable de entorno? Una solución es establecer un encabezado:
El valor acepta especificadores de formato , incluido el
%{NAME}e
especificador para variables de entorno (no olvide la letra minúscula e). A veces, necesitará agregar elREDIRECT_
prefijo, pero no he resuelto cuándo se agrega el prefijo y cuándo no.fuente
REDIRECT_
prefijo? Además, también veo terminología sobre prefijos en otros contextos (htaccess), pero nunca ha estado claro exactamente qué se entiende. ¿Significa que debe nombrar su variable con el prefijo, o agregar el prefijo a su variable nombrada, cuando utiliza ciertos comandos (pero no otros comandos)? ¡Su ejemplo es el primero que muestra tanto la definición de var como el uso de var, así que de esto me inclino a pensar lo último! Los documentos han sido de poca ayuda: suponen que sabemos demasiado y dan muy pocas referencias / enlaces.Si está creando redirecciones, pruebe con curl para evitar problemas de almacenamiento en caché del navegador. Use -I para buscar solo encabezados http. Use -L para seguir todas las redirecciones.
fuente
Encontré esta pregunta al intentar depurar mis problemas de mod_rewrite, y definitivamente tiene algunos consejos útiles. Pero al final lo más importante es asegurarse de tener la sintaxis de expresiones regulares correcta. Debido a problemas con mi propia sintaxis RE, instalar el script regexpCheck.php no era una opción viable.
Pero como Apache utiliza expresiones regulares compatibles con Perl (PCRE), cualquier herramienta que ayude a escribir PCRE debería ayudar. He usado la herramienta RegexPlanet con Java y Javascript RE en el pasado, y me alegró descubrir que también son compatibles con Perl.
Simplemente escriba su expresión regular y una o más URL de ejemplo, y le dirá si la expresión regular coincide (un "1" en la columna "~ =") y, si corresponde, cualquier grupo coincidente (los números en la "división" la columna corresponderá a los números que Apache espera, por ejemplo, $ 1, $ 2, etc.) para cada URL. Afirman que el soporte PCRE está "en beta", pero era justo lo que necesitaba para resolver mis problemas de sintaxis.
http://www.regexplanet.com/advanced/perl/index.html
Simplemente habría agregado un comentario a una respuesta existente, pero mi reputación aún no está en ese nivel. Espero que esto ayude a alguien.
fuente
Con respecto a 4., aún debe asegurarse de que su "código auxiliar de script ficticio" sea en realidad la URL de destino después de que se haya realizado toda la reescritura, ¡o no verá nada!
Un truco similar / relacionado (ver esta pregunta ) es insertar una regla temporal como:
¿Dónde
show.php
hay un script muy simple que solo muestra su$_GET
parámetros (también puede mostrar variables de entorno, si lo desea).Esto detendrá la reescritura en el punto en que lo inserte en el conjunto de reglas, más bien como un punto de interrupción en un depurador.
Si está utilizando Apache <2.3.9, tendrá que usar
[L]
en lugar de[END]
, y puede entonces necesitar agregar:En la parte superior de su conjunto de reglas, si la URL
/show.php
se está reescribiendo.fuente
Algunos errores que observé ocurren al escribir
.htaccess
Uso de
^(.*)$
repetitivo en múltiples reglas, usando^(.*)$
hace que otras reglas sean impotentes en la mayoría de los casos, ya que coincide con todas las URL en un solo golpe.Entonces, si estamos usando una regla para esta url
sapmle/url
, también consumirá esta urlsapmle/url/string
.[L]
La bandera debe usarse para garantizar que nuestra regla haya procesado.Debe saber sobre:
Diferencia en% n y $ n
%n
se compara durante%{RewriteCond}
parte y$n
coincide con%{RewriteRule}
parte.Trabajo de RewriteBase
fuente
Si planea escribir más de una sola línea de reglas en .htacesss,
ni siquiera piense en probar uno de esos métodos de corrección para depurarlo.
He desperdiciado días estableciendo múltiples reglas, sin comentarios de los LOG, solo para finalmente rendirme.
Obtuve Apache en mi PC, copié todo el sitio en su HDD y resolví todo el conjunto de reglas, usando los registros, muy rápido.
Luego revisé mis viejas reglas, que han estado funcionando. Vi que realmente no estaban haciendo lo que deseaban. Una bomba de tiempo, dada una dirección ligeramente diferente.
Hay tantas fallas en las reglas de reescritura, que no es algo lógico en absoluto.
Puede poner en funcionamiento Apache en diez minutos, son 10 MB, buena licencia, * NIX / WIN / MAC listo, incluso sin instalación.
Además, verifique las líneas de encabezado de su servidor y obtenga la misma versión de Apache de su archivo si es antigua. Mi OP todavía está en 2.0; Muchas cosas no son compatibles.
fuente
mod_rewrite
reglas de depuración , pero la apertura "ni siquiera lo piense" es simplemente un mal consejo para los usuarios básicos de servicios compartidos que luchan por entender por qué sushtaccess
archivos no están ' t trabajando de la manera que ellos creen que deberían..htaccess
archivos", entonces esto es más equilibrado. Sí, es razonablemente fácil configurar un servicio local de Apache, pero hacer que refleje el servicio de alojamiento compartido de un proveedor de servicios puede ser complicado, y más allá del nivel de habilidad de muchos usuarios que pueden haber utilizado una configuración de Wordpress con un solo clic, decir, y tener problemas con su.htaccess
archivo.Dejaré esto aquí, tal vez detalles obvios, pero me golpeé la cabeza durante horas: tenga cuidado al usarlo
%{REQUEST_URI}
porque lo que @Krist van Besien dice en su respuesta es totalmente correcto, pero no para la cadena REQUEST_URI , porque la salida de esto TestString comienza con a/
. Así que ten cuidado:fuente
(Similar a la idea de Doin) Para mostrar lo que se está haciendo coincidir, utilizo este código
Guárdelo en r.php en la raíz del servidor y luego haga algunas pruebas en .htaccess
Por ejemplo, quiero hacer coincidir las URL que no comienzan con un prefijo de idioma
fuente
QUERY_STRING
Como lo señaló @JCastell, el probador en línea hace un buen trabajo al probar redireccionamientos individuales contra un archivo .htaccess. Sin embargo, más interesante es la API expuesta que se puede usar para probar por lotes una lista de URL utilizando un objeto json. Sin embargo, para hacerlo más útil, he escrito un pequeño archivo de script bash que hace uso de curl y jq para enviar una lista de direcciones URL y analizar la respuesta json en una salida con formato CSV con el número de línea y la regla coincidentes en el archivo htaccess junto con la URL redirigida, lo que hace que sea bastante útil comparar una lista de URL en una hoja de cálculo y determinar rápidamente qué reglas no funcionan.
fuente
Si está trabajando con url, es posible que desee comprobar si "Habilita Mod Rewrite"
fuente