Cómo depurar .htaccess RewriteRule no funciona

115

Tengo RewriteRuleun .htaccessarchivo en un archivo que no está haciendo nada. ¿Cómo soluciono esto?

  • ¿Cómo puedo verificar si el .htaccessarchivo está siendo leído y obedecido por Apache? ¿Puedo escribir un mensaje de eco "está funcionando"? Si lo escribo, ¿dónde se repite esa línea?
  • Si el .htaccessarchivo no se está usando, ¿cómo puedo hacer que Apache lo use?
  • Si .htaccessse está utilizando pero mi RewriteRuletodavía no tiene ningún efecto, ¿qué más puedo hacer para depurar?
macha
fuente

Respuestas:

144

Ingrese algún valor basura en su , .htaccess por ejemplo foo bar, sakjnaskljdnas cualquier palabra clave no reconocida por htaccess y visite su URL. Si está funcionando, debería obtener un

Error interno de servidor 500

error de servidor interno

El servidor encontró un error interno o una mala configuración y no pudo completar su solicitud ...

Te sugiero que lo pongas poco después RewriteEngine on.


Ya que estás en tu máquina. Supongo que tiene acceso al .confarchivo apache .

abra el .confarchivo y busque una línea similar a:

LoadModule rewrite_module modules/mod_rewrite.so

Si está comentado (#), elimine el comentario y reinicie Apache.


Para iniciar sesión reescribir

RewriteEngine On
RewriteLog "/path/to/rewrite.log"
RewriteLogLevel 9

Pon las 3 líneas anteriores en tu virtualhost. reinicie httpd.

RewriteLogLevel 9¡Usar un valor alto para Level ralentizará dramáticamente su servidor Apache! Utilice el archivo de registro de reescritura en un nivel superior a 2 solo para depurar. El nivel 9 registrará casi todos los detalles de reescritura.


ACTUALIZAR

Las cosas han cambiado en Apache 2.4:

DESDE Actualización a 2.4 desde 2.2

Se han eliminado las directivas RewriteLog y RewriteLogLevel . Esta funcionalidad ahora se proporciona configurando el nivel apropiado de registro para el módulo mod_rewrite usando la directiva LogLevel . Consulte también la sección de registro mod_rewrite.

Para obtener más información sobre LogLevel, consulte la Directiva LogLevel

tu puedes lograr

RewriteLog "/path/to/rewrite.log"

de esta manera ahora

LogLevel debug rewrite_module:debug
PensandoMono
fuente
Ok, entonces el problema es que estoy tratando de agregar una reescritura al archivo .htaccess y, por alguna razón, no la estoy usando.
macha
@macha prueba el método anterior. Si recibe un error interno del servidor, eso significa que mod_rewrite (.htaccess) está habilitado. ¿Estás en un host compartido?
ThinkingMonkey
No, estoy trabajando en mi localhost, ¿tiene una idea de cuándo se carga el archivo .htaccess? Pensé que apache leería esto primero
macha
Los archivos @macha .htaccess nunca se cargan. Apache accede a ellos (si están presentes) cuando intenta acceder a una página que está presente en esa carpeta.
ThinkingMonkey
ok, mi pregunta fue, si alguien solicita una página web, ¿apache va directamente a los scripts del lado del servidor o buscaría el archivo .htaccess en esa carpeta y luego continuar?
macha
52

La respuesta 'Ingrese algún valor basura' no funcionó para mí, mi sitio continuaba cargándose a pesar de la basura ingresada.

En su lugar, agregué la siguiente línea en la parte superior del archivo .htaccess:

deny from all

Esto le permitirá saber rápidamente si se está recogiendo .htaccess o no. Si se está utilizando el .htaccess, los archivos de esa carpeta no se cargarán en absoluto.

caitriona
fuente
4
Esta es la prueba más simple si no le importa que nada funcione durante unos segundos mientras verifica.
Mordred
1
Sí, me tomó alrededor de un segundo verificar que el sitio en el que estaba trabajando no usaba archivos .htaccess.
Bonh
1
Gracias, funciona a las mil maravillas :) ¡me ahorró algo de tiempo depurando!
Martijn van Hoof
32

Generalmente, cualquier cambio en el .htaccess debería tener efectos visibles. Si no tiene ningún efecto, verifique los archivos de configuración de Apache, algo como:

<Directory ..>
    ...
    AllowOverride None
    ...
</Directory>

Debería cambiarse a

AllowOverride All

Y podrá cambiar las directivas en archivos .htaccess.

jgpATs2w
fuente
Gracias. Encontré la sección relevante en el archivo principal apache2.conf para el árbol de directorios / var / www
Tim Richardson
6

Quizás un método más lógico sería crear un archivo (por ejemplo, test.html), agregar algo de contenido y luego intentar configurarlo como la página de índice:

DirectoryIndex test.html

En su mayor parte, la regla .htaccess anulará la configuración de Apache donde se trabaja a nivel de directorio / archivo

Cez
fuente
4

Para responder a la primera pregunta de las tres formuladas, una forma sencilla de ver si el archivo .htaccess funciona o no es desencadenar un error personalizado en la parte superior del archivo .htaccess:

ErrorDocument 200 "Hello. This is your .htaccess file talking."
RewriteRule ^ - [L,R=200]

En cuanto a su segunda pregunta, si el archivo .htaccess no se está leyendo, es posible que la configuración principal de Apache del servidor haya AllowOverride establecido en None. La documentación de Apache tiene sugerencias de solución de problemas para ese y otros casos que pueden estar impidiendo que .htaccess surta efecto.

Finalmente, para responder a su tercera pregunta, si necesita depurar variables las que hace referencia en su regla de reescritura o está utilizando una expresión que desea evaluar independientemente de la regla, puede hacer lo siguiente:

Salida del variable a la que hace referencia para asegurarse de que tenga el valor que espera:

ErrorDocument 200 "Request: %{THE_REQUEST} Referrer: %{HTTP_REFERER} Host: %{HTTP_HOST}"
RewriteRule ^ - [L,R=200]

Prueba la expresión independiente poniéndola en una <If>directiva. Esto le permite asegurarse de que su expresión esté escrita correctamente o coincida cuando lo espera:

<If "%{REQUEST_URI} =~ /word$/">
    ErrorDocument 200 "Your expression is priceless!"
    RewriteRule ^ - [L,R=200]
</If>

¡Feliz depuración de .htaccess!

PeterA
fuente
3

Si tiene acceso al directorio bin de apache, puede usar,

httpd -M para comprobar primero los módulos cargados.

 info_module (shared)
 isapi_module (shared)
 log_config_module (shared)
 cache_disk_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 proxy_module (shared)
 proxy_ajp_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 socache_shmcb_module (shared)
 ssl_module (shared)
 status_module (shared)
 version_module (shared)
 php5_module (shared)

Después de eso, directivas simples como Options -Indexeso deny from allsolidificarán que .htaccess están funcionando correctamente.

Abhishek Gurjar
fuente
1

Para probar sus reglas de reescritura de htaccess, simplemente complete la URL a la que está aplicando las reglas, coloque el contenido de su htaccess en el área de entrada más grande y presione el botón "Probar".

http://htaccess.mwl.be/

Ganesh Kandu
fuente
-1

¿Por qué no poner un poco de basura en su archivo .htaccess e intentar volver a cargar apache? Si apache no se inicia, sabrá que está funcionando. Elimine la basura y luego vuelva a cargar Apache si carga, felicidades por haber configurado .htaccess correctamente.

Ben Rabidou
fuente
7
No creo que Apache no pueda iniciarse o ejecutarse si hay un .htaccess incorrecto, dado que no verifica .htaccess hasta que haya una solicitud de página.
Andrew