Use PushState e pré-composição
A maneira atual (2015) de fazer isso é usar o método JavaScript pushState.
O PushState altera o URL na barra superior do navegador sem recarregar a página. Digamos que você tenha uma página contendo guias. As guias ocultam e mostram o conteúdo, e o conteúdo é inserido dinamicamente, usando AJAX ou simplesmente configurando display: none e display: block para ocultar e mostrar o conteúdo correto da guia.
Quando as guias são clicadas, use pushState para atualizar o URL na barra de endereços. Quando a página for renderizada, use o valor na barra de endereço para determinar qual guia será exibida. O roteamento angular fará isso por você automaticamente.
Pré-composição
Há duas maneiras de acessar um SPA (PushState Single Page App)
- Via PushState, em que o usuário clica em um link PushState e o conteúdo é AJAX.
- Pressionando o URL diretamente.
O hit inicial no site envolve atingir diretamente o URL. Os hits subsequentes terão apenas AJAX no conteúdo, pois o PushState atualiza o URL.
Os rastreadores colhem links de uma página e os adicionam a uma fila para processamento posterior. Isso significa que, para um rastreador, cada ocorrência no servidor é uma ocorrência direta, eles não navegam pelo Pushstate.
A pré-composição agrupa a carga útil inicial na primeira resposta do servidor, possivelmente como um objeto JSON. Isso permite que o mecanismo de pesquisa renderize a página sem executar a chamada AJAX.
Existem evidências que sugerem que o Google pode não executar solicitações AJAX. Mais sobre isso aqui:
https://web.archive.org/web/20160318211223/http://www.analog-ni.co/precomposing-a-spa-may-become-the-holy-grail-to-seo
Os mecanismos de pesquisa podem ler e executar JavaScript
O Google já consegue analisar o JavaScript há algum tempo; é por isso que eles originalmente desenvolveram o Chrome, para atuar como um navegador sem cabeçalho completo para o Google spider. Se um link tiver um atributo href válido, o novo URL poderá ser indexado. Não há mais nada a fazer.
Se clicar em um link além de acionar uma chamada pushState, o site poderá ser navegado pelo usuário via PushState.
Suporte do mecanismo de pesquisa para URLs do PushState
Atualmente, o PushState é suportado pelo Google e Bing.
Google
Aqui está Matt Cutts, respondendo à pergunta de Paul Irish sobre PushState para SEO:
http://youtu.be/yiAF9VdvRPw
Aqui está o Google anunciando suporte JavaScript completo para o spider:
http://googlewebmastercentral.blogspot.de/2014/05/understanding-web-pages-better.html
O resultado é que o Google suporta o PushState e indexa os URLs do PushState.
Consulte também a busca das ferramentas para webmasters do Google como Googlebot. Você verá que seu JavaScript (incluindo Angular) é executado.
Bing
Aqui está o anúncio do suporte do Bing para URLs PushState bastante datadas de março de 2013:
http://blogs.bing.com/webmaster/2013/03/21/search-engine-optimization-best-practices-for-ajax-urls/
Não use HashBangs #!
Os URLs Hashbang eram uma piada feia, exigindo que o desenvolvedor fornecesse uma versão pré-renderizada do site em um local especial. Eles ainda funcionam, mas você não precisa usá-los.
Os URLs Hashbang são assim:
domain.com/#!path/to/resource
Isso seria associado a uma metatag como esta:
<meta name="fragment" content="!">
O Google não os indexará neste formulário, mas extrairá uma versão estática do site do URL _escaped_fragments_ e o indexará.
Os URLs do Pushstate se parecem com qualquer URL comum:
domain.com/path/to/resource
A diferença é que o Angular lida com eles interceptando a alteração em document.location que lida com isso em JavaScript.
Se você deseja usar URLs PushState (e provavelmente o faz), retire todos os URLs e metatags antigos de estilo hash e simplesmente ative o modo HTML5 no seu bloco de configuração.
Testando seu site
As ferramentas do Google para webmasters agora contêm uma ferramenta que permitirá buscar um URL como google e renderizar JavaScript conforme o Google a renderizar.
https://www.google.com/webmasters/tools/googlebot-fetch
Gerando URLs PushState em Angular
Para gerar URLs reais em Angular, em vez de # prefixados, defina o modo HTML5 no seu objeto $ locationProvider.
$locationProvider.html5Mode(true);
Lado do servidor
Como você está usando URLs reais, será necessário garantir que o mesmo modelo (mais algum conteúdo pré-composto) seja enviado pelo servidor para todos os URLs válidos. Como você faz isso varia de acordo com a arquitetura do servidor.
Mapa do site
Seu aplicativo pode usar formas incomuns de navegação, por exemplo, passe o mouse ou role. Para garantir que o Google possa direcionar seu aplicativo, eu provavelmente sugeriria a criação de um mapa do site, uma lista simples de todos os URLs aos quais ele responde. Você pode colocá-lo no local padrão (/ sitemap ou /sitemap.xml) ou informar o Google sobre isso usando as ferramentas para webmasters.
É uma boa ideia ter um mapa do site de qualquer maneira.
Suporte do navegador
O Pushstate funciona no IE10. Em navegadores antigos, o Angular retornará automaticamente aos URLs no estilo hash
Uma página de demonstração
O conteúdo a seguir é renderizado usando um URL pushstate com pré-composição:
http://html5.gingerhost.com/london
Como pode ser verificado, neste link , o conteúdo é indexado e está aparecendo no Google.
Exibição de códigos de status do cabeçalho 404 e 301
Como o mecanismo de pesquisa sempre acessa o servidor em todas as solicitações, você pode fornecer códigos de status de cabeçalho no servidor e esperar que o Google os veja.