.htaccess no redirige a la página con prefijo www correctamente


9

Estoy tratando de redirigir una url sin www. a www.version (example.com a www.example.com). Yo uso lo habitual

RewriteCond %{HTTP_HOST} ^example\.com [nc]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

Esto funciona en todos mis otros proyectos. Sin embargo, en este sitio en particular, termina con un bucle de redireccionamiento. Aquí está la parte extraña: intenté enroscar la versión que no es www para ver qué encabezados envía usando curl --get http://example.com --dump-header domain.header > domain.html. El archivo de encabezado se veía así:

HTTP/1.1 301 Moved Permanently
Date: Mon, 06 Jun 2011 14:45:16 GMT
Server: Apache/2.2.16 (Debian)
Location: http://example.com/
Vary: Accept-Encoding
Content-Length: 310
Content-Type: text/html; charset=iso-8859-1

Sin embargo, el archivo HTML resultante fue este:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.example.com/">here</a>.</p>
<hr>
<address>Apache/2.2.16 (Debian) Server at example.com Port 80</address>
</body></html>

(tenga en cuenta la diferencia de direcciones entre los archivos) ¿Alguien sabe cómo solucionar esto (y qué demonios lo está causando)? Cualquier otra directiva de reescritura de URL funciona bien.

EDITAR: el registro de reescritura contenía esto: (mucha gente accede al sitio, por lo que el registro de reescritura se hizo bastante largo, no estoy 100% seguro de si esta es la parte correcta)

192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] strip per-dir prefix: /var/www/oup/81/ ->
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] applying pattern '(.*)' to uri ''
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] rewrite '' -> 'http://www.example.com/'
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] explicitly forcing redirect with http://www.example.com/
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] escaping http://www.example.com/ for redirect
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] redirect to http://www.example.com/ [REDIRECT/301]

La línea de registro de acceso (probablemente la correcta):

192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] "GET / HTTP/1.1" 301 555 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.77 Safari/534.24"

La definición del virtualhost:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName example.com
        ServerAlias example.com www.example.com
        DocumentRoot /var/www/example/
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/example/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride All
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

EDIT2: está bien, acabo de darme cuenta de que si hago esto (renuncié e intenté redirigir esto sin .htaccess):

//if clause determining that we're running on example.com and not www.example.com
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.example.com' . $_SERVER['REQUEST_URI']);
header('Connection: close');

Causa EXACTAMENTE EL MISMO bucle de redireccionamiento. En serio, ¿qué demonios? ¿Alguien tiene una idea de lo que podría estar causando esto?


¿Compiló usted mismo Apache o? Debería ser imposible que el encabezado de ubicación difiera de lo que hay en la página, ya que en este caso se toman de la misma variable, por lo que es bastante extraño. Supongo que las solicitudes se pasan directamente a Apache, ¿no hay otro servidor en el medio?
Tim Stone

No compilé Apache y no hay otro servidor intermedio.

probablemente su servidor NS no está configurado correctamente
venimus

44
No es necesario repetir el nombre del servidor en la entrada ServerAlias.
Chris

¿Puedes poner todo el contenido del archivo aquí
Deshacer el

Respuestas:


2

Lo que me parece extraño es la Location: http://domain.cz/línea de encabezado informada por CURL. Nunca redirige a ese dominio. El registro de redireccionamiento tampoco contiene ninguna mención de él.

De alguna manera, el Locationencabezado parece estar alterado después de que modrewrite hace sus cosas, y dado que intentó cambiar también el encabezado con PHP, el Locationencabezado aparentemente cambia después de que se procesa la solicitud. La única explicación que se me ocurre es que está modificando el encabezado de ubicación con mod_header en alguna parte.

¿Ha verificado todos los archivos de configuración (httpd.conf, los archivos .conf incluidos y el archivo .htaccess) si en alguna parte encuentra una línea similar a esta:

Header set Location (...)

o

Header edit Location (...)

No he encontrado nada como esto.

2
¿Se está conectando directamente a Apache, o hay algún servidor de caché o proxy que pueda cambiar los encabezados? La directiva ProxyPassReverse también puede cambiar el encabezado de ubicación ( httpd.apache.org/docs/2.0/mod/mod_proxy.html#ProxyPassReverse ).

puede haber algún proxy intermedio, lo revisaré tan pronto como llegue a trabajar mañana.

@Jakob Egger: no he encontrado la directiva ProxyPassReverse en ninguna parte.
cypher

1

Además de habilitar rewritelog (si tiene acceso para cambiar httpd.conf), debe eliminar de la ecuación la aplicación que vive en este sitio. Elimina / renombra temporalmente el index.php predeterminado (o cualquier página de índice que esté sirviendo a tu aplicación) para asegurarte de que no esté causando esto.

Hay muchos informes de aplicaciones (por ejemplo, WordPress) que hacen que aparezcan estas páginas de redireccionamiento predeterminadas de Apache si están mal configuradas.

Además, verifique el resto de la configuración de apache para ver si hay otras instrucciones de 'redirección' que puedan estar en conflicto.


La aplicación está bien, la probé en un servidor diferente y en un dominio diferente (copié toda la aplicación) y funcionó bien. Supongo que es algo en la configuración de apache, pero no puedo entender qué.

La aplicación puede estar bien, pero también puede estar en conflicto con la configuración en este servidor. Parece que su aplicación está actualmente en producción, por lo que puedo ver cómo 'deshabilitarla' no es ideal. Por diversión, puede agregar una cadena de consulta al final de la redirección como un indicador para ayudar al descubrimiento, entonces / $ 1? Nowww = 1 o algo similar.
Gavin C

No, NO está en producción.

Genial, entonces no puede hacer daño mover el archivo de índice al 100% excluirlo como parte del problema :)
Gavin C

Maldita sea, lo que quise escribir fue que está en producción, no sé cómo sucedió esto :-)

0

¿Puedes probar este código alternativo mod_rewrite:

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Esto falló exactamente de la misma manera.

¿Puedes habilitar RewriteLog y ver qué escupe?
anubhava

¿Y cómo puedo hacer eso exactamente? :-)

Consulte aquí: httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog Lo único es que esta directiva entra en la configuración de apache NO en .htaccess.
anubhava

1
Copié la misma regla (como mi respuesta anterior) a mi instalación de Apache y ejecuté el mismo comando curl que tiene en su pregunta y obtuve Location: http://www.domain.com/como parte de mis encabezados, por lo que en mi caso, los encabezados y html muestran el mismo dominio, es decir www.domain.com. ¿También puede pegarle las líneas relevantes de access.log en su pregunta anterior?
anubhava

0

¿podría intentar usar [NC] en lugar de [nc], podría ser tan simple


Y sin embargo no lo es :-) (ya lo intenté, no funcionó)

0

Espero que tenga acceso al servidor, se agregó la línea de redireccionamiento después de la carpeta de documentos del sitio especificada seguido

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain\.cz [NC]
RewriteRule ^/(.*) http://www.domain.cz/$1 [L,R=301]

Si no tiene acceso al servidor, agregue esas líneas en httaccess comenzando / cambie la porción.

Es posible que no haya agregado "RewriteEngine on" antes de la redirección.


He agregado RewriteEngine on, como dije, funciona correctamente en otro servidor, pero no en este.

AllowOverride All allow from all agrega esas líneas en el archivo de configuración del servidor

0

Tratar:

RewriteCond %{HTTP_HOST} ^domain.cz [NC]
RewriteRule (.*) http://www.domain.cz/$1 [R=301,L]

0

Asegúrese de tenerlo Options +FollowSymLinkssi está trabajando dentro de un contexto de directorio.

De lo contrario, si está utilizando hosts virtuales basados ​​en nombres, intente:

<VirtualHost *:80>
  ServerName domain.cz
  Redirect / http://www.domain.cz/
</VirtualHost>

<VirtualHost *:80>
  ServerName www.domain.cz
  # whatever else
</VirtualHost>

He actualizado la pregunta con la definición de VirtualHost.

¿Intentó la solución VirtualHost múltiple anterior o está configurado para usar mod_rewrite?
Chris

En primer lugar, no quería usar múltiples VirtualHosts, pero dadas las circunstancias, lo intenté de todos modos y no ayudó.

0

Después de leer todas las respuestas, puede consultar el archivo de / etc / hosts ... tal vez todas sus comprobaciones procedan de su computadora. Intenta acceder desde una ubicación diferente.


No, nada en los hosts sobre ese dominio.

0

Tengo una segunda idea El registro del servidor que publicó muestra una dirección de "192.168.1.221", que es una dirección de la red local. ¿Todas las entradas de registro muestran la misma dirección IP? Si este es el caso, hay un proxy entre usted y el servidor. Este proxy probablemente usa ProxyPassReverseo Header editpara cambiar el Locationencabezado.

Esta es una configuración habitual para evitar el problema cuando el servidor de fondo coloca su propio nombre de host en el Locationencabezado, en lugar del nombre de host del servidor proxy externo.

Si realmente hay un servidor proxy, tendrá que cambiar la configuración del servidor proxy en lugar de la configuración del servidor de fondo, ya que el proxy siempre sobrescribirá la información.

Esto significa que todo el tiempo hemos estado buscando el servidor incorrecto: ¡El problema está en el servidor proxy!


Mañana llamo al soporte técnico de la compañía que ejecuta este servidor. Creo que debe ser eso, te lo haré saber.
cypher

0

Podría haber caracteres no imprimibles como nulo en el .htaccessarchivo.

hexdump -C .htaccess

0

Creo que le falta un signo $ después de su condición de reescritura. Por favor, inténtalo:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.cz$
RewriteRule ^(.*)$ http://www.domain.cz/$1 [R=301,L]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.