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?
Respuestas:
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
Location
encabezado parece estar alterado después de que modrewrite hace sus cosas, y dado que intentó cambiar también el encabezado con PHP, elLocation
encabezado 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:
o
fuente
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.
fuente
¿Puedes probar este código alternativo mod_rewrite:
fuente
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 decirwww.domain.com
. ¿También puede pegarle las líneas relevantes de access.log en su pregunta anterior?¿podría intentar usar [NC] en lugar de [nc], podría ser tan simple
fuente
Espero que tenga acceso al servidor, se agregó la línea de redireccionamiento después de la carpeta de documentos del sitio especificada seguido
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.
fuente
RewriteEngine on
, como dije, funciona correctamente en otro servidor, pero no en este.Tratar:
fuente
Asegúrese de tenerlo
Options +FollowSymLinks
si está trabajando dentro de un contexto de directorio.De lo contrario, si está utilizando hosts virtuales basados en nombres, intente:
fuente
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.
fuente
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
ProxyPassReverse
oHeader edit
para cambiar elLocation
encabezado.Esta es una configuración habitual para evitar el problema cuando el servidor de fondo coloca su propio nombre de host en el
Location
encabezado, 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!
fuente
Podría haber caracteres no imprimibles como nulo en el
.htaccess
archivo.fuente
Creo que le falta un signo $ después de su condición de reescritura. Por favor, inténtalo:
fuente