É possível remover o símbolo # dos URLs angular.js?
Ainda quero poder usar o botão Voltar do navegador, etc, quando alterar a exibição e atualizar o URL com parâmetros, mas não quero o símbolo #.
O tutorial routeProvider é declarado da seguinte maneira:
angular.module('phonecat', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/phones', {templateUrl: 'partials/phone-list.html', controller: PhoneListCtrl}).
when('/phones/:phoneId', {templateUrl: 'partials/phone-detail.html', controller: PhoneDetailCtrl}).
otherwise({redirectTo: '/phones'});
}]);
Posso editar isso para ter a mesma funcionalidade sem o #?
Respostas:
Sim, você deve configurar
$locationProvider
e definirhtml5Mode
comotrue
:fonte
html5Mode(true)
. No IE, você precisa usar#
nas rotas.IE lt 10
meio Internet Explorer menos versão 10$locationProvider.html5Mode(true);
emif !(IE lt 10)
?Certifique-se de verificar o suporte do navegador para a API de histórico html5:
fonte
If the HTML5 History API is not supported by a browser, the $location service will fall back to using the hashbang URLs automatically
Para remover a tag Hash de uma URL bonita e também para que seu código funcione após a minificação, você precisa estruturar seu código como no exemplo abaixo:
fonte
requireBase: false
+1$locationProvider.html5Mode
código, meu código$urlRouterProvider.otherwise('/home');
parou de funcionar.Escrevo uma regra no web.config depois de
$locationProvider.html5Mode(true)
configuradaapp.js
.Espero que ajude alguém.
No meu index.html, adicionei isso ao
<head>
Não se esqueça de instalar o url rewriter para iis no servidor.
Além disso, se você usar a API da Web e o IIS, esse URL de correspondência não funcionará, pois mudará as chamadas da API. Portanto, adicione a terceira entrada (terceira linha de condição) e forneça um padrão que excluirá as chamadas de
www.yourdomain.com/api
fonte
Se você estiver na pilha do .NET com MVC e AngularJS, é isso que você deve fazer para remover o '#' do URL:
Configure seu href base na sua página _Layout:
<head> <base href="https://stackoverflow.com/"> </head>
Em seguida, adicione o seguinte na sua configuração angular do aplicativo:
$locationProvider.html5Mode(true)
Acima, o '#' será removido do URL, mas a atualização da página não funcionará, por exemplo, se você estiver na página "yoursite.com/about", o refreash fornecerá um 404. Isso ocorre porque o MVC não conhece o roteamento angular e, pelo padrão do MVC, procurará uma página do MVC para 'about' que não existe no caminho de roteamento do MVC. A solução alternativa para isso é enviar todas as solicitações de página do MVC para uma única exibição do MVC e você pode fazer isso adicionando uma rota que captura todos
url:
fonte
Você pode ajustar o modo html5, mas isso é funcional apenas para os links incluídos nas âncoras html da sua página e como a URL se parece na barra de endereços do navegador. Tentar solicitar uma subpágina sem a hashtag (com ou sem html5mode) de qualquer lugar fora da página resultará em um erro 404. Por exemplo, a seguinte solicitação CURL resultará em um erro de página não encontrada, independentemente do html5mode:
embora o seguinte retorne a página principal / raiz:
A razão para isso é que qualquer coisa após a hashtag ser removida antes que a solicitação chegue ao servidor. Portanto, uma solicitação de
http://foo.bar/#/portfolio
chegada ao servidor é solicitadahttp://foo.bar
. O servidor responderá com uma resposta 200 OK (presumivelmente)http://foo.bar
e o agente / cliente processará o restante.Portanto, nos casos em que você deseja compartilhar um URL com outras pessoas, não há opção a não ser incluir a hashtag.
fonte
Siga as duas etapas:
1. Primeiro defina o $ locationProvider.html5Mode (true) no arquivo de configuração do aplicativo.
Por exemplo -
angular.module('test', ['ui.router']) .config(function($stateProvider, $urlRouterProvider, $locationProvider) { $locationProvider.html5Mode(true); $urlRouterProvider.otherwise('/'); });
2.Segundo, defina a <base> dentro da sua página principal.
Por exemplo ->
<base href="https://stackoverflow.com/">
O serviço $ location fará o fallback automaticamente para o método de parte de hash para navegadores que não suportam a API de histórico do HTML5.
fonte
Minha solução é criar .htaccess e usar o código #Sorian. Sem .htaccess falhei em remover #
fonte
De acordo com a documentação. Você pode usar:
Por exemplo: Se você clicar em:
<a href="https://stackoverflow.com/other">Some URL</a>
No navegador HTML5 : angular será redirecionado automaticamente para
example.com/other
No Navegador não HTML5 : o angular será redirecionado automaticamente para
example.com/#!/other
fonte
Esta resposta assume que você está usando o nginx como proxy reverso e já definiu $ locationProvider.html5mode como true.
-> Para as pessoas que ainda podem estar lutando com todas as coisas legais acima.
Certamente, a solução @maxim grach funciona bem, mas para a solução de como responder a solicitações que não desejam que a hashtag seja incluída em primeiro lugar, o que pode ser feito é verificar se o php está enviando 404 e reescrever o URL. A seguir está o código para nginx,
No local php, detecte o erro 404 php e redirecione para outro local,
Em seguida, reescreva o URL no local de redirecionamento e proxy_pass os dados, é claro, coloque o URL do site no lugar do URL do meu blog. (Pedido: questione isso somente depois de tentar)
E veja a mágica.
E definitivamente funciona, pelo menos para mim.
fonte
Iniciar a partir remover index.html tudo
#
a partir de<a href="#/aboutus">About Us</a>
então ele deve olhar como<a href="https://stackoverflow.com/aboutus">About Us</a>
.Agora na marca de cabeça de gravação index.html<base href="https://stackoverflow.com/">
apenas após a última tag meta .Agora, no seu roteamento, js injeta
$locationProvider
e escreve$locatonProvider.html5Mode(true);
algo parecido com isto: -Para mais detalhes, assista a este vídeo https://www.youtube.com/watch?v=XsRugDQaGOo
fonte
Acho que é realmente tarde para isso. Mas adicionar a configuração abaixo às importações app.module faz o trabalho:
fonte
Etapa 1: injetar o serviço $ locationProvider no construtor da configuração do aplicativo
Etapa 2: adicione a linha de código $ locationProvider.html5Mode (true) ao construtor da configuração do aplicativo.
Etapa 3: na página do contêiner (aterrissagem, mestre ou layout), adicione a tag html, como
<base href="https://stackoverflow.com/">
dentro dela.Etapa 4: remova todo o '# "da configuração de roteamento de todas as tags âncora. Por exemplo, href =" # home "torna-se href =" home "; href =" # about "torna-se herf =" about "; href =" # contact "torna-se href =" contato "
fonte
Basta adicionar
$locationProvider
Eme em seguida, adicione
$locationProvider.hashPrefix('');
depoisÉ isso aí.
fonte