2008-10-18 17 views
7

Tengo una aplicación web tomcat 6 ejecutándose con apache httpd como interfaz. Estoy usando mod_proxy y mod_proxy_ajp para reenviar las solicitudes a tomcat. Mi servidor ejecuta Ubuntu. Ahora estoy tratando de usar mod_rewrite para eliminar el www, por lo que mi URL del sitio web canónica es http://domain.com en lugar de http://www.domain.com¿Cómo soluciono el problema de por qué apache no aplica las reglas de reescritura?

He leído una serie de tutoriales sobre el uso de mod_rewrite, pero no puedo obtener ninguna reescritura trabajo. Intenté colocar la regla de reescritura en un archivo .htaccess (después de modificar mi archivo/etc/apache/sites-available/default para establecer AllowOverride all). Intenté 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 de alguna manera impidiendo que se utilizaran las reglas de reescritura, así que intenté desactivarlo también ... y todavía no recibo ninguna reescritura, y nada para el registro.

En este momento no tengo ni idea de qué probar a continuación. ¿Cómo puedo solucionar los problemas por los que apache no está utilizando mis reglas de reescritura?

Como 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 es tan útil a la comunidad en grande como respuestas acerca de cómo usted soluciona las directivas de apache en general. Por ejemplo, ¿hay alguna manera de habilitar el registro hasta el punto en que me diga qué directivas se están aplicando y en qué orden cuando entra la solicitud?

Editar 2: He conseguido que las cosas funcionen ahora. Mis servidores virtuales no estaban bien configurados, y tampoco tenía la reescritura correcta. Aquí es las directivas finales de reescritura llegué al trabajo:

<IfModule mod_rewrite.c> 
     RewriteEngine On 
     RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC] 
     RewriteRule ^(.*)$ http://domain.com$1 [L,R=301] 
</IfModule> 
+0

¿Se ha asegurado de que mod_rewrite esté cargado? –

+0

Sí. Lo cargué usando "a2enmod rewrite", que configura un enlace simbólico en mods-enabled para apuntar a mod \ _rewrite.load en mod-available. También intenté escribir mal una de las reglas de reescritura (es decir, "Rewrite3Rule") para probar que apache realmente está tomando las reglas, y apache me da un mensaje de error como era de esperar. Cuando arreglo la ortografía y reinicio Apache, se reinicia bien. –

Respuesta

4

Tratando de responder a su pregunta: Para depurar el funcionamiento de Apache se puede ajustar el LogLevel a un nivel más bajo (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 ello. Por ejemplo, el valor predeterminado [RequestLogLevel][2] es 0, por ejemplo, el módulo no escribe ningún mensaje.Veo que lo configuró a 3, pero al igual que RoBorg dijo cambiarlo a 9 que tal vez es demasiado bajo para su caso.

Tratando de sove su problema: tratar de cambiar la forma de volver a escribir el nombre de host mediante el formulario inversa - mira si el nombre de host es lo que quiere y, si no, cambiarlo por el nombre de host que desea. Como se indica en el URL Rewriting Guide - Apache HTTP Server en el sitio de Apache:

canónicas Hostnames

Descripción: El objetivo de esta regla es para forzar el uso de un nombre de host en particular, en preferencia a otros nombres de host que se puede usar para llegar al mismo sitio. Por ejemplo, si desea forzar el uso de 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 example.com-www.example.com pero tuvieron la idea. Solo ajústelo para su caso.

+0

Escapar del carácter de punto no hará la diferencia en este caso –

+1

El punto aún coincidirá con un punto, incluso si un punto escapado solo coincide con un punto real un punto sin escama coincidirá con cualquier cosa, incluido el punto con el que se suponía que coincidiría el punto. –

+0

Ambos tienen razón. Mi error. Respuesta actualizada –

0

intente aumentar el nivel de registro de hasta 9 (el máximo).
Asegúrese de que apache tenga los derechos adecuados sobre el archivo de registro (aunque si lo creó, parece probable que también pueda escribir en él).
Pruebe una regla de reescritura diferente, sin condición, por ejemplo RewriteRule .* www.google.com [RL]

+0

Buena sugerencia, pero todavía no veo ni la reescritura en funcionamiento ni nada en el registro. –

1

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ó

0

En qué contexto se colocan estas reglas? Puede colocarlos en un host virtual diferente, por ejemplo. Intenta ponerlos fuera de cualquier contenedor si solo tienes un dominio para probar.

En cualquier caso, hay una alternativa para lograr 'no-www', consiste en utilizar dos máquinas virtuales, uno para www y otro de 'no-www'. www uno redirige a la otra:

<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> 
+0

He intentado colocarlos en mi /etc/apache2/apache2.conf, /etc/apache2/httpd.conf, /etc/apache2/mods-available/rewrite.conf (que está vinculado simbólicamente a/etc/apache2/mods -habilitado). Entiendo que estas reglas siempre se aplicarán. Solo estoy ejecutando un dominio/host virtual aquí. –

+0

Intenté su sugerencia, y apache se queja de incluir la parte del puerto 80 (*: 80): [error] VirtualHost *: 80 - no se admite la mezcla * de puertos y puertos que no sean * con una dirección NameVirtualHost, procediendo con resultados indefinidos . Saqué el número de puerto y se reinició bien, pero no se redirigió. –

+1

Este es un caso más apropiado para IRC que para Stack Overflow. Hay muchas configuraciones para depurar. Pruebe #apache en irc.freenode.net si ninguna de las sugerencias aquí funciona. –

Cuestiones relacionadas