¿Cómo soluciono problemas por qué apache no aplica mis reglas de reescritura?
-
03-07-2019 - |
Pregunta
Tengo una aplicación web de Tomcat 6 que se ejecuta con apache httpd como parte frontal. Estoy usando mod_proxy y mod_proxy_ajp para reenviar las solicitudes a Tomcat. Mi servidor está ejecutando ubuntu. Ahora estoy tratando de usar mod_rewrite para eliminar el sitio web principal, de modo que la URL de mi sitio web canónico es http://domain.com en lugar de http://www.domain.com
He leído varios tutoriales sobre el uso de mod_rewrite, pero no puedo hacer que la reescritura funcione. He intentado colocar la regla de reescritura en un archivo .htaccess (después de modificar mi archivo / etc / apache / sites-available / default para configurar AllowOverride all). He intentado poner la regla de reescritura en apache2.conf, httpd.conf y rewrite.conf. He intentado todo esto con el registro de reescritura activado. El archivo de registro se crea, pero Apache no le ha escrito nada. Pensé que tal vez mod_proxy estaba impidiendo de alguna manera que se usaran las reglas de reescritura, así que también intenté deshabilitar eso ... y todavía no puedo volver a escribir, y nada en el registro.
En este momento no tengo ni idea de qué intentar a continuación. ¿Cómo hago para resolver problemas por qué apache no usa mis reglas de reescritura?
Para referencia, aquí están mis directivas de reescritura:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3
</IfModule>
Editar : las respuestas a continuación son útiles para mi caso particular, pero probablemente no lo sean tanto para la comunidad en general como las respuestas sobre cómo solucionar los problemas de las directivas de apache en general. Por ejemplo, ¿hay una manera de habilitar el registro hasta el punto en el que me diga qué directivas se están aplicando en el orden en que se recibe la solicitud?
Edit 2 : Ahora tengo cosas para trabajar. Mis hosts virtuales no estaban configurados correctamente, y tampoco tenía la regex de reescritura correcta. Aquí están las directivas de reescritura finales que tengo que trabajar:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
RewriteRule ^(.*)$ http://domain.com$1 [L,R=301]
</IfModule>
Solución
Intentando responder a su pregunta : para depurar la operación de Apache, puede ajustar el LogLevel a un nivel inferior (tal vez debug
). Pero incluso si pone debug
si deshabilita el registro para el módulo en cuestión, no recibe ningún mensaje de este. Por ejemplo, el [RequestLogLevel] [2]
predeterminado es 0, por ejemplo, el módulo no escribe ningún mensaje. Veo que lo configuraste en 3 pero como RoBorg dijo que cámbielo a 9
que quizás sea demasiado bajo para su caso.
Intentando solucionar su problema : intente cambiar la forma en que reescribe el nombre de host utilizando la forma inversa: mire si el nombre de host es lo que desea y, si no, cámbielo por el nombre de host que desee . Como se indica en la Guía de reescritura de URL - Servidor HTTP Apache en Apache Sitio:
Nombres de host canónicos
Descripción : El objetivo de esta regla es forzar el uso de un nombre de host particular, en preferencia a otros nombres de host que Puede ser utilizado para llegar al mismo sitio. Por ejemplo, si desea forzar la uso de www.example.com en lugar de example.com, puede usar una variante de la siguiente receta. Solución:
# To force the use of RewriteEngine On RewriteCond %{HTTP_HOST} !^www\.example\.com [NC] RewriteCond %{HTTP_HOST} !^$ RewriteRule ^/(.*) http://www.example.com/$1 [L,R]
En su ejemplo, cambian de example.com
a www.example.com
pero tienes la idea. Solo ajústalo a tu caso.
Otros consejos
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
RewriteRule ^(.*)$ "http\:\/\/domain\.com\/$1" [R=301,L]
</IfModule>
Tenía el mismo problema con mi servidor, pero esto funcionó
Intente aumentar el nivel de registro hasta 9 (el máximo).
Asegúrese de que apache tenga los derechos adecuados para el archivo de registro (aunque si lo creó, es probable que también pueda escribir en él).
Pruebe una regla de reescritura diferente, sin condiciones, por ejemplo, RewriteRule. * Www.google.com [RL]
¿En qué contexto se ubican estas reglas? Puede que los coloques bajo un host virtual diferente, por ejemplo. Intente colocarlos fuera de cualquier contenedor si solo tiene un dominio para probar.
En cualquier caso, hay una alternativa para lograr 'no-www', consiste en usar dos hosts virtuales, uno para www y otro para 'no-www'. www uno redirige al otro:
<VirtualHost *:80>
ServerName www.domain.com
Redirect permanent / http://domain.com
</VirtualHost>
<VirtualHost *:80>
ServerName domain.com
#The rest of the configuration (proxying, etc.)
</VirtualHost>