Redirecionamento Permanente / Redirecionamento 301 de URLs em Servidor Windows

Ruy Miranda
Otimização de Sites

O redirecionamento permanente ou 301 de URLs/páginas, é necessário, assim como o temporário, para a boa otimização de certos sites. Contudo, trata-se de tarefa pouco compreendida e por vezes complexa. As dificuldades aumentam com o tamanho e certas características do site, e ainda, com a existência de dois sistemas, um aplicado aos servidores Apache e outro aos servidores Windows. Em algumas situações, as instruções para o Apache se parecem com um segmento de um hieróglifo. Já as usadas no Windows são mais simples e mais lógicas, embora, como o Apache, não facilite a vida do otimizador quando o site é mais complexo. Aqui eu mostro algumas instruções que resolvem os problemas da maioria dos sites hospedados em servidores Windows.

Estes redirecionamentos apresentam algumas diferenças em função das páginas serem em asp ou em html ou em ambos.

Páginas em ASP – A página index num servidor Windows é, por convenção, uma página intitulada default.asp. Tal página pode existir tanto na raiz do site e, neste caso é a página index do site, como em pastas. Assim, pode haver

www.nomedodominio.com.br/default.asp e

www.nomedodominio.com.br/pastaqualquer/default.asp

Para facilitar a compreensão, vou dar exemplos de redirecionamentos em páginas Asp.

1. Um dos redirecionamentos mais necessário é o do domínio do primeiro nível (.com.br, .net, .org, etc) sem www para domínio com www. Por exemplo,

http://nomedodominio.com.br para http://www.nomedodominio.com.br

Para isto, colocamos na página default.asp existente na raiz, a seguinte instrução:

<%
URL = Request.ServerVariables("SERVER_NAME")

Select Case URL

Case "nomedodominio.com.br"
Response.Redirect ("http://www.nomedodominio.com.br/default.asp")

End Select
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

Nota: As informações sobre o código do html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

foram colocadas para mostrar o topo da página a que me referi.

O efeito é o mesmo se colocamos /default.asp, como a seguir:

<%
URL = Request.ServerVariables("SERVER_NAME")

Select Case URL

Case "nomedodominio.com.br"
Response.Redirect ("http://www.nomedodominio.com.br/default.asp")

End Select
%>

Pode-se usar também uma outra formulação do redirecionamento, com o mesmo efeito, colocado entre as tags <head> </head> e que é a seguinte:

<%
' Permanent redirection'
Response.Status = "301 Moved Permanently"
Response.AddHeader "Location", "http://www.domains.com.br/default.asp"
Response.End
%>

2. Instrução em que os redirecionamentos devem ser sempre no mesmo nível. Por exemplo, pode-se redirecionar uma página que se encontra na raiz para outra, também na raiz, mas o redirecionamento não funciona se for da raiz para uma pasta e vice-versa.

O redirecionamento a seguir não funciona:

<%

URL = Request.ServerVariables("SERVER_NAME")

Select Case URL

Case "www.nomedodominio.com.br/pastaqualquer/default.asp"
Response.Redirect ("http://www.nomedodominio.com.br/")

End Select
%>

Também não funciona o redirecionamento que se segue:

<%

URL = Request.ServerVariables("SERVER_NAME")

Select Case URL

Case "www.nomedodominio.com.br/"
Response.Redirect ("http://www.nomedodominio.com.br/pastaqualquer/default.asp")

End Select
%>

Mas o redirecionamento que se segue funciona:

<%
URL = Request.ServerVariables("SERVER_NAME")

Select Case URL

Case "nomedodominio.com.br"
Response.Redirect ("http://www.nomedodominio.com.br/")

End Select
%>

O que se segue também funciona:

<%
URL = Request.ServerVariables("SERVER_NAME")

Select Case URL

Case "nomedodominio.com.br"
Response.Redirect ("http://www.nomedodominio.com.br/arquivo.html")

End Select
%>

Observe que, nestes dois casos, a despeito do URL nomedodominio.com.br ser diferente do www.nomedodominio.com.br/ e do www.nomedodominio.com.br/arquivo.html, eles, a rigor, se acham no primeiro nível. Observe também que, por ser no mesmo nível, a página pode ser redirecionada para outra em html.

3. Instrução em que os redirecionamentos podem ser de níveis diferentes - Por outro lado, uma das formulações citadas, e que vem a seguir novamente, permite mudança de nível quando a página de partida é asp:

<%
' Permanent redirection'
Response.Status = "301 Moved Permanently"
Response.AddHeader "Location", "http://www.nomedodominio.com.br/pastaqualquer/default.asp"
Response.End
%>

Ela se aplica também quando o destino é html:

<%
' Permanent redirection'
Response.Status = "301 Moved Permanently"
Response.AddHeader "Location", "http://www.nomedodominio.com.br/pastaqualquer/arquivo.html"
Response.End
%>

Nota: Este tipo de instrução, em que aparece explicitamente o status da página como redirecionado permanentemente (301 Moved Permanently) é importante. A outra instrução, citada acima, pode ser interpretada pelo servidor como redirecionamento temporário e, seis meses depois, voltar a exibir a página antiga.

4. Podemos redirecionar dois ou mais domínios ao mesmo tempo, desde que tenham o mesmo destino. Exemplo:

<%
URL = Request.ServerVariables("SERVER_NAME")

Select Case URL

Case "nomedodominio.com.br","www.nomedodominio.com/"
Response.Redirect ("http://www.nomedodominio.com.br/arquivo.html")

End Select
%>

Observe que entre os dois domínios a serem redirecionados existe apenas uma vírgual sem espaço antes ou depois. Esta instrução, como foi dito no começo, fica no topo da página.

5. Redirecionamento de URL sem www, relativo a página que se encontra dentro de uma pasta.

<%
URL = Request.ServerVariables("SERVER_NAME")

Select Case URL

Case "nomedodominio.com.br/pastaqualquer/"
Response.Redirect ("http://www.nomedodominio.com.br/pastaqualquer/")

End Select
%>

Observe que o princípio é o mesmo dos URLs relativos aos arquivos da raiz do site.

Páginas em HTML – As páginas de um site hospedado num servidor Windows podem ser todas em asp ou html ou php. Quando lido com páginas em html, as instruções que se seguem, colocadas em qualquer lugar entre as tags <head></head> podem fazer o redirecionamento.

<meta http-equiv="refresh" content="0; url=http://www.nomedodominio.com.br/index.html">

No servidor Windows, o URL que termina em index.html funciona como um arquivo qualquer, mas diferente de default.asp.

Nesse redirecionamento
-- 0 significa que o refresh é dado a cada 0 segundo, ou seja, não há refresh. Se se coloca 1, a cada segundo será dado um refresh na página.
-- /index.html é o destino da página na qual foi colocado este redirecionamento.

Se estamos na página que corresponde ao arquivo 1 e queremos redirecioná-la para o arquivo2, escrevemos:

<meta http-equiv="refresh" content="0; url=http://www.nomedodominio.com.br/arquivo2.html">

Tanto faz se o redirecionamento está sendo feito em URLs de arquivos/páginas situados na raiz do site ou em pastas e sub-pastas.

Esta instrução tem a vantagem de permitir redirecionamentos em níveis diferentes, partindo de páginas asp ou html e direcionadas para páginas asp ou html. Mas ela não tem como ser aplicada ao caso de dominio.com.br redirigido para www.dominio.com.br/

Notas:
-- Este redirecionamento, também chamado meta refresh, funciona muito bem na tela. Há quem diga que ele não é reconhecido por robots dos mecanismos de busca, como o Googlebot, mas já tive oportunidade de ver este redirecionamento operando normalmente.
-- Esta instrução entre <head> e </head> se sobrepõe a qualquer instrução colocada no topo da página, antes da denominação do html. Se existirem as duas, esta prevalecerá.
-- Esta instrução pode também ser usada para páginas em asp, ou seja, redirecionar página asp para outra asp.
-- Esta instrução funciona de uma página asp para uma página em html.
-- Esta instrução funciona de página html para página asp.
-- Esta instrução funciona para redirecionamentos em níveis diferentes.

Tal flexibilidade torna este redirecionamento muito usado por hackers e por programas maliciosos. Em conseqüência, é mal-visto pelos mecanismos de busca, especialmente o Google. Há comentários de que seu uso pode gerar punição. Por isto, informe-se mais sobre o assunto, se deseja utilizá-lo. Veja o que é dito no Google a respeito

Páginas em ASP e HTML – Um site pode ter as duas, o que é mais comum, e ainda, php e html. Este enterecruzamento por vezes torna as coisas mais complexas, e em algumas cirdunstâncias, facilita, como veremos.

Página Específica de Redirecionamento – Os redirecionamentos citados até aqui podem também ser feitos de forma coletiva, quando cabível, e então utilizamos uma página default.asp para listar os redirecionamentos. Por exemplo, a página default.asp pode conter as instruções que se seguem.

<%
URL = Request.ServerVariables("SERVER_NAME")

Select Case URL

Case "nomedodominio.com.br"
Response.Redirect "http://www.nomedodominio.com.br"
Case "www.nomedodominio.com.br/pastaqualquer/"
Response.Redirect "http://www.nomedodominio.com.b/pastaqualquer/arquivo.html"

End Select
%>


Se dois ou mais URLs tiverem o mesmo destino, podemos também instruir assim (no caso de estarmos redirecionando para a página índice do site):

<%
URL = Request.ServerVariables("SERVER_NAME")

Select Case URL

Case "nomedodominio.com.br","www.nomedodominio.com.br",
"www.nomedodomionio.com.br/pastaqualquer/arquivoqualquer.index.html
Response.Redirect "http://www.nomedodominio.com.br/"

End Select
%>

Observações importantes:
1. O que você vê acima, em todo este artigo, é complexo devido ao grande número de possibilidades contidas nas diversas instruções.
2. Quando se faz essas redirecionamentos, é comum obtermos resposts diferentes, conforme o navegador. Por exemplo, um redirecionamento pode funcionar no Netscape e não funcionar no IE e no Firefox. Mas este problema está praticamente superado com a evolução dos navegadores.
3. Um redirecionamento pode funcionar de forma diferente no mesmo navegador de versões diferentes. Por exemplo, pode funcionar na última versão do IE e não funcionar em uma versão antiga.
4. Quando um redirecionamento é perfeito, justo, ele funciona rápido, e em todos os navegadores.
5. Quando lidamos com arquivos asp e html no mesmo site, devemos sempre colocar as instruções:
-- no topo da página de partida, se o redirecionamento é de uma página asp para página asp; .
-- entre as tag <head></head> se vamos redirecionar uma página asp ou html para outra página html
6. Muitas vezes precisamos ser criativos, já que os manuais dos servidores Apache e Windows são omissos em certas situaçóes. Algumas questões que se seguem demonstram isto.
7. Encadeamento de instruções – Podemos fazer uma página abrir em outra, passando por uma página intermediária.
-- Colocamos na página de partida, que chamaremos A:
< meta http-equiv="refresh" content="0; url=http://www.nomedodominio. com .br/arquivo1.htm"> . .
-- Colocamos no arquivo1:
< meta http-equiv="refresh" content="0; url=http://www.nomedodominio. com .br/arquivo2.htm">

A página A vai abrir no arquivo2. Já tive situações em que foi necessário fazer essa ponte.

Se mudamos o tempo de refresh, podemos ter alguns efeitos interessantes, mas que são inconveniente para os mecanismos de busca. Podemos também elimar a função tempo e, neste caso, o código fica assim: <meta http-equiv="refresh" content="http://www.nomedodominio.com.br/arquivo2.html">
8. Esqueletos de HTML.– Em certas situações, principalmente quando a página de partida é em html, podemos usar o esqueleto do html dessa página. Minha experiência até aqui é: não só a estratégia funciona omo também dá problemas com os mecanismos de busca. Veja este exemplo:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
< meta http-equiv="refresh" content="0; url=http://www.nomedodominio. com .brarquivo.htm"> <title></title>
</head>
<body>
</body>
</html>

Observe que o esqueleto foi usado porque a única maneira de fazer esta instrução funcionar é colocá-la entre <head> e </head>. O URL da página é normal e ela só não tem conteúdo.
9. Redirecionamentos sem www.– O redirecionamento de URL sem www para URL com www pode trazer alguns problemas. Por exemplo, a instrução que se segue, colocada em uma página default.asp redireciona o nomedodominio.com.br para nomedodominio.com.br/default.asp
<%
select case Request.ServerVariables("SERVER_NAME")
case "nomedodominio.combr" response.redirect("http://www.nomedodominio. com .br")

end select
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title></title>
</head>
<body>
</body>
</html>

Como redirecionar nomedodominio.com.br para www.nomedodominio.com.br/index,html?

Usei a seguinte estratégia:

<%
select case Request.ServerVariables("SERVER_NAME") case "nomedodominio.com.br" response.redirect("http://www.nomedodominio. com .br")

end select
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title></title>
< meta http-equiv="refresh" content="0; url=http://www.nomedodominio. com .br/index.html">
</head>
<body>
</body>
</html>

Observe que o robot do mecanismo de busca recebe, logo no começo da página, instrução para se mover para a página default.asp e, logo em seguida, para se mover desta para a página index.html.

Portanto, o redirecionamento permanente ou 301 em servidor Windows pode ser feito com várias instruções. Pode ser feito também em páginas asp, php e html. Ele aumenta de complexidade em função do aumento da complexidade do site. Lamentavelmente a Microsoft não disponibiliza, de forma ordenada, informações que respondam a todas as situações de redirecionamento. Embora elas sejam possíveis, precisamos quebrar a cabeça para executá-las.

Flexibiliadade do Servidor Windows IIS – O servidor Windows IIS 6.0 (o 7.0 se acha em versão beta) apresenta uma flexibilidade que resolve muitos problemas de redirecionamento envolvendo a página inicial de um site.

Trata-se da possibilidade de você definir qual será sua página inicial. Você pode escolher se será asp, php, html, htm, etc, inclusive com o seunome.html. Por exemplo, a página inicial pode ser cinfigurada para aparecer assim: www.seudominio.com.br/seunome.html. Mas, você, naturalmente, não vai fazer isto.

Entretanto, tal habilidade do servidor IIS permite que você defina, por exemplo, que o site será todo em html. E como fazer o redirecionamento do URL sem www, evitando aquelas voltas todas acima citadas? Como fazer esse redirecionamento de forma a apresentar a página apenas com uma barra(/) no finai, ao invés de /index.html?

Uma solução consiste em habilitar arquivos php no servidor, e colocar no site uma página index.php (além da página index.html). Na página index.php colocamos a seguinte instrução:

<?
$host = $_SERVER['HTTP_HOST'];
if ( !strstr($host,"www.") ) {
header("Location: http://www.$host/");
}
else {
$fp=fopen("index.html", "r");
while(!feof($fp)) {
echo fgets($fp,4096);
}
fclose($fp);

}
?>

E aí, quando alguém digitar sua home, com ou sem www, com ou sem / , ela será apresentada assim: .com.br/, o que corresponde à página index.html.

Isto é uma operação muito simples quando temos acesso ao servidor IIS e podemos configurá-lo. Em geral, nos serviços de hospedagem compartilhada, que é a usada pela imensa maioria dos usuários, não é possível esse acesso. E, por outro lado, a maioria das empresas de hopedagem não habilitam o php no servidor IIS e tampouco atendem seu eventual pedido de colocar, complementarmente, a página de abertura do site como index.php. Entendemos o motivo: a tarefa é "muito complexa", posto depender, no primeiro caso, de marcar um círculo e, no segundo, escrever index.php e clicar... Mas lembre-se: o servidor IIS precisa comportar php; se não comportar, dependendo de certas particularidades dele, e se você tiver de redirecionar página html para página html, em hospedagem compartilhada, precisará de duas coisas:
-- usar um programa chamado ISAPI Rewrite,
-- preparar-se para uma das missões mais inglórias da internet (fazer tal redirecionamento no Apache, comparado com tais dificuldades no IIS, é como mastigar água... e pedra).

Tudo isto pode parecer muito confuso para você. E com razão. Espero, no futuro poder colocar um redirecionamento permanente nesta página e enviar os visitantes para outra página onde tudo fique claro e simples. Enquanto isto você pode conferir se seus redirecionamentos estão funcionando como devem.

Fevereiro/2007
Atualizado em março/2007

Proprietário    Nota Legal     Política    Blog    Contato
Copyright © 2005-2014, Otimização de Sites Todos os direitos reservados