Vários redirecionamentos condicionais, tudo em um único .htaccess (página inicial)

Vários redirecionamentos condicionais, tudo em um único .htaccess (página inicial)

Eu tenho uma pasta que simplesmente contém um html de página única "Em breve".

Tenho então vários domínios que aponto para esta pasta de vez em quando, conforme necessário.

Simples, certo?

Bem, o que eu quero é uma condição em que, se a página original solicitada não for www, vá para www (301> PLUS, se não for https, vá para https (301) E então redirecione todo o tráfego para https://www.originating-domain.xzy/index.html(302)

o objetivo é que esta seja uma página de destino para uso múltiplo, mas SEMPRE 301 para https://www e depois 302 paraindex.html

Já tenho esse não-www para www e http para https funcionando em cada site:

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]

agora quero adicionar o redirecionamento temporário 302 para index.html.

ou existe apenas uma maneira melhor de fazer isso completamente? tipo, já que tudo isso é temporário de qualquer maneira... 302 todo o tráfego para indexar eu tentei isso, mas não funcionou

RewriteCond %{REQUEST_URI} !.*index\.html
RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]

Responder1

RewriteCond %{REQUEST_URI} !.*index\.html
RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]

Existem alguns problemas com isso ...

  1. Você parece estar sentindo falta doRewriteRule padrão(primeiro argumento) completamente, então esta diretiva não corresponderá.

  2. Se isso correspondesse, o prefixo seria o www.subdomíniode novo. Presumo que você esteja colocando esse redirecionamentodepoisos redirecionamentos canônicos (HTTP para HTTPS e não www para www) - como deveria ser. Então, isso redirecionaria para https://www.www.example.com/index.html, porque no momento em que esse redirecionamento é acionado, o nome do host já é canônico.

Odoença( RewriteConddiretiva) não é realmente necessária, uma vez que esta verificação (que /index.htmlainda não é solicitada) poderia ser realizada de forma mais eficiente pela RewriteRuleprópria diretiva.

Por exemplo:

RewriteRule !^index\.html$ /index.html [R=302,L]

Não há necessidade de incluir o esquema + nome do host nosubstituiçãostring, já que você deseja redirecionar para o mesmo de qualquer maneira. Se você quisesse ser explícito, poderia escrever https://%{HTTP_HOST}/index.html.

Observe que, tal como está, index.htmlnão pode fazer referência a nenhum outrolocalrecursos (imagens, CSS, JavaScript, etc.), pois essas solicitações também serão redirecionadas. Para permitir o acesso a recursos locais, você precisaria adicionar algumas condições para excluir solicitações de recursos estáticos.

RewriteCond %{REQUEST_URI} !.\.(jpg|png|webp|css|js)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.html$ /index.html [R=302,L]

Como alternativa, hospede esses recursos em um domínio externo. (Ou em um subdiretório e exclua todo o subdiretório.)

No entanto, se optar por "redirecionar", talvez eu redirecione para um arquivo nomeado mais exclusivo/significativo, por exemplo. /coming-soon.html. O problema de usar /index.htmlé se mais tarde você quiser servir conteúdo diferente nesse URL e ele tiver sido armazenado em cache (por qualquer motivo). Embora /coming-soon.htmlprovavelmente deva ser "noindex".

NO ENTANTO, pode ser preferível não redirecionar e, em vez disso, servir umtemporárioResposta "503 Serviço indisponível". Verminha respostaconsulte a seguinte pergunta na pilha de webmasters para obter mais informações sobre isso:


Aparte:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]

Você está atrás de um proxy front-end que gerencia a conexão SSL?

Se estiver, tudo bem, embora a segunda condição que verifica a HTTPSvariável do servidor seja supérflua. No entanto, se você estivernãoatrás de um proxy SSL, essas diretivas ficam vulneráveis ​​a serem contornadas (ou seja, o usuário não é redirecionado para HTTPS) se um X-Forwarded-Proto: httpscabeçalho for injetado na solicitação.


ATUALIZAR:

OK, isso funciona como eu quero. Mas posso combiná-los de alguma forma?

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]

Conforme observado acima, a última regra é essencialmente a mesma que a seguinte (quando usada em combinação com os redirecionamentos canônicos anteriores), que é mais simples e eficiente:

RewriteRule !^coming-soon\.html$ /coming-soon.html [R=302,L]

Na segunda regra você também deve alterar oRewriteRule padrãode ^(.*)$para ^(o mesmo que a primeira regra). ^(.*)$captura desnecessariamente uma referência anterior e é menos eficiente.

Você mencionou em um comentário anterior (agora excluído) que queria que isso funcionasse também para qualquer subdomínio. Ele "funciona" para qualquer subdomínio, porém, sempre precederá um wwwsubdomínio adicional, o que pode ou não ser desejável? (Não é comum ter um wwwsub-subdomínio emsubdomínios. YMMV.)

Não há necessidade real de “combinar” essas regras. Você certamente não pode combiná-los se quiser redirecionar 301 para www + HTTPS antes de redirecionar 302 para a página "em breve". Embora as duas primeiras regras (redirecionamentos 301) possam ser “combinadas” em uma única regra, elas não servem para nada.

O único problema menor aqui é que existem potencialmente (no máximo) 2 redirecionamentos. Primeiro, um 301 para www+HTTPS no caminho da URL original e um segundo 302 para a página "em breve".

Eu questionaria se você realmente precisa do redirecionamento 301 inicial para www+HTTPS quando estiver redirecionando o usuário de qualquer maneira para umtemporáriopágina "em breve". Depois de implementar o novo site (substituindo a página "em breve"), você implementará o redirecionamento canônico. O redirecionamento 302 ainda pode redirecionar para www+HTTPS. (Há, no entanto, um caso extremo quando /coming-soon.htmlé solicitado diretamente.)

Por exemplo:

# 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]

Qualquer solicitação http://example.com/foo302 é redirecionada diretamente para https://www.example.com/coming-soon.html.

Se http://example.com/coming-soon.htmlfor solicitado, ele será redirecionado 301 para https://www.example.com/coming-soon.html(apenas corrigindo o subdomínio HTTPS e www).

Existe apenas no máximo 1 redirecionamento externo.

Responder2

OK, isso funciona como eu quero. Mas posso combiná-los de alguma forma?

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]

informação relacionada