Múltiples redirecciones condicionales, todo en un solo .htaccess (página de destino)

Múltiples redirecciones condicionales, todo en un solo .htaccess (página de destino)

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...

  1. Parece que te estás perdiendo elRewriteRule patrón(primer argumento) por completo, por lo que esta directiva no coincidirá.

  2. 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 a https://www.www.example.com/index.html, porque cuando se activa esta redirección, el nombre de host ya es canónico.

Elcondición( RewriteConddirectiva) no es realmente necesaria, ya que esta verificación (que /index.htmlaún no se ha solicitado) podría ser manejada de manera más eficiente por la RewriteRulepropia 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.htmlno 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.htmles si luego desea publicar contenido diferente en esa URL y se ha almacenado en caché (por cualquier motivo). Aunque /coming-soon.htmlprobablemente 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 HTTPSvariable 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: httpsse 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 wwwsubdominio adicional, lo que puede ser deseable o no. (No es habitual tener un wwwsubsubdominio 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.htmlse 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/fooes redirigida 302 directamente a https://www.example.com/coming-soon.html.

Si http://example.com/coming-soon.htmlse 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]

información relacionada