![Redirigir a una URL absoluta en .htaccess devuelve un nombre de host incorrecto en OpenShift](https://rvso.com/image/658339/Redirigir%20a%20una%20URL%20absoluta%20en%20.htaccess%20devuelve%20un%20nombre%20de%20host%20incorrecto%20en%20OpenShift.png)
Estoy creando un sitio web enCambio abierto. Se ejecuta bajo Apache 2.2.15, pero no tengo acceso a la raíz ni a los registros de Apache, por lo que estoy intentando emular directorios virtuales en un archivo .htaccess en la raíz de mi sitio. La mayor parte funciona bien, pero hay un problema de redireccionamiento que no puedo resolver.
El sitio está estructurado así:
raíz de aplicación/repositorio- la raíz del sitio donde se encuentra .htaccess
raíz-aplicación/repo/dominio_ejemplo
raíz-aplicación/repo/dominio_ejemplo/principal- sitio web principal (WordPress)
En WordPress, mi blog está en www.example.com/blog, pero antes de migrar a WordPress, tenía varios artículos en un subdominio blogs.example.com. Para mantener los enlaces, configuro comandos de redireccionamiento en .htaccess. Funcionaron bien en mi antiguo proveedor de alojamiento compartido. Incluso funcionaron bien en OpenShiftantesAgregué www.example.com como alias de OpenShift. Sin embargo, desde que agregué el alias, no puedo forzar que .htaccess devuelva www. si el nombre de host original comienza con blogs.
De los apachesRedireccionar documentación:
La nueva URL debe ser una URL absoluta que comience con un esquema y un nombre de host. En Apache HTTP Server 2.2.6 y posteriores, también se puede utilizar una ruta URL que comience con una barra, en cuyo caso se agregará el esquema y el nombre de host del servidor actual. Luego, cualquier solicitud que comience con URL-path devolverá una solicitud de redireccionamiento al cliente en la ubicación de la URL de destino.
Lo que espero:Si proporciono una URL absoluta como destino, la redirección debería devolver esa URL al cliente. Luego, el cliente puede volver a emitir su solicitud utilizando la URL correcta.
Lo que está sucediendo:La redirección está sucediendo (veo el 302 en Firebug), pero apunta al dominio de origen, no al de destino. Es como si estuviera haciendo el segundo bit (usando el "esquema y nombre de host del servidor actual") aunque haya proporcionado una URL absoluta.
Aquí hay un extracto de mi .htaccess:
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
# This section from https://my.bluehost.com/cgi/help/347#redirect
RewriteCond %{HTTP_HOST} ^(www.)?example\.com$
RewriteCond %{REQUEST_URI} !^/domain_example/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /domain_example/main/$1
RewriteCond %{HTTP_HOST} ^(www.)?example\.com$
RewriteRule ^(/)?$ domain_example/main/index.php [L]
# blogs.example.com redirects
redirect 302 /mark/post/Check-Windows-Time-Settings.aspx http://www.example.com/blog/2010/05/check-windows-time-settings/
Con ese .htaccess, cuando buscohttp://blogs.example.com//mark/post/Check-Windows-Time-Settings.aspxy veo la respuesta en Firebug, veo que la redirección 302 va ahttp://blogs.example.com/blog/2010/05/check-windows-time-settings/. Pero eso no existe, por lo que aparece un 404 No encontrado.¿Por qué va a los blogs? cuando le digo que vaya a www. ?
Me preguntaba si el alias de OpenShift de alguna manera anula el Redirect, pero de acuerdo con la documentación de Redirect:
Las directivas de redireccionamiento tienen prioridad sobre las directivas Alias y ScriptAlias, independientemente de su orden en el archivo de configuración.
También intenté agregar una trampa explícita y reescribir una ruta que comienza con blogs.example.com/blog/ (que es lo que aparentemente devuelve la redirección):
RewriteCond %{HTTP_HOST} ^blogs\.example\.com/blog/ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]
Todavía recibo el 404 No encontrado con eso. De hecho, incluso la URL más básica,http://blogs.example.com/blog/, da un 404.
¿Cómo consigo que las redirecciones funcionen en esta situación?
Actualización 27 de mayo de 2015 #1
Intenté usar la lógica "no" en el bloque Reescribir:
RewriteCond %{HTTP_HOST} !^www\.example\.com/blog/ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]
Esto conduce a un bucle de redireccionamiento infinito, 20 redirecciones antes de que se dé por vencido. Cada redirección todavía comienza conhttp://blogs.ejemplo.comEntonces, algo todavía impide que RewriteRule escriba "www" al principio de la URL.
Los mismos resultados si termino la lógica NOT con $
:
RewriteCond %{HTTP_HOST} !^www\.example\.com/blog/$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]
Actualización 27 de mayo de 2015 #2
@Quasidynamic señaló que %(HTTP_HOST) solo incluye el nombre de host y nada después. Así que intenté esto para seleccionar solo las URL que comenzaran con www.example.com/blog
:
RewriteCond %{HTTP_HOST} ^blogs\.example\.com$ [NC]
RewriteCond %{REQUEST_URI} ^/blog/$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=302,L]
No hay bucle infinito, pero el redireccionamiento aún va a blogs.
, luego la reescritura no logra enviarlo a www.
.
Actualización 28 de mayo de 2015
Según la solicitud de @Quasidynamic, probando este bloque:
RewriteCond %{HTTP_HOST} ^blogs\.example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=302,L]
Como era de esperar a estas alturas, cuando busco blogs.example.com
, se redirige a blogs.example.com/blog/
. Debido a que todavía coincide con RewriteCond, luego se redirige a blogs.example.com/blog/blog/
. Indefinidamente. Nunca, nunca va a www.example.com
, que es la raíz del problema que he tenido desde el principio: una vez que lo agregué blogs.example.com
como subdominio de OpenShift, ya no puedo usar .htaccess para redirigir www.example.com
sin importar lo que intente.
Respuesta1
Si su [antiguo] es blogs.example.com y su [destino] es www.example.com/blog:
RewriteCond %{HTTP_HOST} blogs.example.com$ RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=301,L]
Estabas cerca, pero intentabas hacer coincidir /blog en la solicitud que no estará allí, eso es solo en el sitio [de destino], según entiendo tu situación.
Utilice el código 301: "El estado 301 significa que el recurso (página) se mueve permanentemente a una nueva ubicación. El cliente/navegador no debe intentar solicitar la ubicación original, sino utilizar la nueva ubicación de ahora en adelante". de
https://stackoverflow.com/questions/1393280/http-redirect-301-permanent-vs-302-temporary