![Múltiples redirecciones condicionales, todo en un solo .htaccess (página de destino)](https://rvso.com/image/770104/M%C3%BAltiples%20redirecciones%20condicionales%2C%20todo%20en%20un%20solo%20.htaccess%20(p%C3%A1gina%20de%20destino).png)
Tengo una carpeta que simplemente tiene un HTML de una sola página "Próximamente".
Luego tengo varios dominios a los que apunto a esta carpeta de vez en cuando según sea necesario.
Sencillo ¿verdad?
Bueno, lo que quiero tener es una condición en la que, si la página solicitada original no era www, ir a www (301> MÁS, si no es https, ir a https (301) Y luego redirigir todo el tráfico a https://www.originating-domain.xzy/index.html
(302)
el propósito es que esta sea una página de destino para uso múltiple, pero SIEMPRE 301 a https://www
y luego 302 aindex.html
Ya tengo este no www a www y http a https funcionando en cada sitio:
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
ahora quiero agregar la redirección temporal 302 a index.html
.
¿O simplemente existe una mejor manera de hacer esto completamente? Como, de todos modos, todo esto es temporal... 302 todo el tráfico para indexar. Intenté esto pero no funcionó.
RewriteCond %{REQUEST_URI} !.*index\.html
RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]
Respuesta1
RewriteCond %{REQUEST_URI} !.*index\.html RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]
Hay un par de problemas con esto...
Parece que te estás perdiendo el
RewriteRule
patrón(primer argumento) por completo, por lo que esta directiva no coincidirá.Si esto coincidiera, antepondría el
www.
subdominio.de nuevo. Supongo que estás poniendo esta redirección.despuéslas redirecciones canónicas (HTTP a HTTPS y no www a www), como debería ser. Entonces, esto redirigiría ahttps://www.www.example.com/index.html
, porque cuando se activa esta redirección, el nombre de host ya es canónico.
Elcondición( RewriteCond
directiva) no es realmente necesaria, ya que esta verificación (que /index.html
aún no se ha solicitado) podría ser manejada de manera más eficiente por la RewriteRule
propia directiva.
Por ejemplo:
RewriteRule !^index\.html$ /index.html [R=302,L]
No es necesario incluir el esquema+nombre de host en elsustitucióncadena ya que de todos modos desea redirigir a la misma. Si quisieras ser explícito, podrías escribir https://%{HTTP_HOST}/index.html
.
Tenga en cuenta que, tal como está, index.html
no puede hacer referencia a ningún otrolocalrecursos (imágenes, CSS, JavaScript, etc.) ya que estas solicitudes también serán redirigidas. Para permitir el acceso a recursos locales, deberá agregar un par de condiciones para excluir solicitudes de recursos estáticos.
RewriteCond %{REQUEST_URI} !.\.(jpg|png|webp|css|js)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.html$ /index.html [R=302,L]
Alternativamente, aloje estos recursos en un dominio externo. (O en un subdirectorio y excluir todo el subdirectorio).
Sin embargo, si elijo "redireccionar", tal vez redirigiría a un archivo con un nombre más exclusivo/significativo, por ejemplo. /coming-soon.html
. El problema con el uso /index.html
es si luego desea publicar contenido diferente en esa URL y se ha almacenado en caché (por cualquier motivo). Aunque /coming-soon.html
probablemente debería ser "noindex".
SIN EMBARGO, puede ser preferible no redirigir en absoluto y en su lugar servir untemporarioRespuesta "Servicio 503 no disponible". Vermi respuestaa la siguiente pregunta en la pila de Webmasters para obtener más información al respecto:
Aparte:
RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
¿Está detrás de un proxy front-end que gestiona la conexión SSL?
Si es así, está bien, aunque la segunda condición que verifica la HTTPS
variable del servidor es, por lo tanto, superflua. Sin embargo, si eresnodetrás de un proxy SSL, estas directivas son vulnerables a ser eludidas (es decir, el usuario no es redirigido a HTTPS) si X-Forwarded-Proto: https
se inyecta un encabezado en la solicitud.
ACTUALIZAR:
OK, esto funciona como quiero. ¿Pero puedo combinarlos de alguna manera?
RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{REQUEST_URI} !.*coming-soon\.html [NC] RewriteRule ^(.*)$ https://%{HTTP_HOST}/coming-soon.html [R=302,L]
Como se señaló anteriormente, la última regla es esencialmente la misma que la siguiente (cuando se usa en combinación con las redirecciones canónicas anteriores), que es más simple y eficiente:
RewriteRule !^coming-soon\.html$ /coming-soon.html [R=302,L]
En la segunda regla también debes cambiar elRewriteRule
patrónde ^(.*)$
a ^
(lo mismo que la primera regla). ^(.*)$
captura innecesariamente una referencia inversa y es menos eficiente.
Mencionaste en un comentario anterior (ahora eliminado) que querías que esto también funcionara para cualquier subdominio. "Funciona" para cualquier subdominio, sin embargo, siempre antepondrá un www
subdominio adicional, lo que puede ser deseable o no. (No es habitual tener un www
subsubdominio ensubdominios. YMMV.)
No existe una necesidad real de "combinar" estas reglas. Ciertamente no puede combinarlos si desea redirigir 301 a www+HTTPS antes de redirigir 302 a la página "próximamente". Si bien las dos primeras reglas (redirecciones 301) se pueden "combinar" en una sola regla, no sirve para nada.
El único problema menor aquí es que potencialmente hay (como máximo) 2 redirecciones. Primero, un 301 a www+HTTPS en la ruta URL original y un segundo 302 a la página "próximamente".
Me preguntaría si realmente necesita el redireccionamiento 301 inicial a www+HTTPS cuando de todos modos redirige al usuario a untemporarioPágina "próximamente". Una vez que haya implementado el nuevo sitio (reemplazando la página "próximamente"), implementará la redirección canónica. La redirección 302 aún puede redirigir a www+HTTPS. (Sin embargo, existe un caso límite cuando /coming-soon.html
se solicita directamente).
Por ejemplo:
# 302 redirect to the coming soon page (www+HTTPS)
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$
RewriteRule !^coming-soon\.html$ https://www.%1/coming-soon.html [R=302,L]
# Edge case...
# The following two rules only apply if "/coming-soon.html" is requested directly
# and either non-www hostname and/or HTTP is requested
# in which case 301 redirect to the same on www+HTTPS
# www subdomain is missing...
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# HTTP + www has been requested
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Cualquier solicitud http://example.com/foo
es redirigida 302 directamente a https://www.example.com/coming-soon.html
.
Si http://example.com/coming-soon.html
se debe solicitar, se redirige a 301 https://www.example.com/coming-soon.html
(simplemente arreglando el subdominio HTTPS y www).
Sólo hay como máximo 1 redireccionamiento externo.
Respuesta2
OK, esto funciona como quiero. ¿Pero puedo combinarlos de alguna manera?
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_URI} !.*coming-soon\.html [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/coming-soon.html [R=302,L]