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 ...
Você parece estar sentindo falta do
RewriteRule
padrão(primeiro argumento) completamente, então esta diretiva não corresponderá.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 parahttps://www.www.example.com/index.html
, porque no momento em que esse redirecionamento é acionado, o nome do host já é canônico.
Odoença( RewriteCond
diretiva) não é realmente necessária, uma vez que esta verificação (que /index.html
ainda não é solicitada) poderia ser realizada de forma mais eficiente pela RewriteRule
pró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.html
nã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.html
provavelmente 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 HTTPS
variá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: https
cabeç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 www
subdomínio adicional, o que pode ou não ser desejável? (Não é comum ter um www
sub-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/foo
302 é redirecionada diretamente para https://www.example.com/coming-soon.html
.
Se http://example.com/coming-soon.html
for 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]