Quero ativar o modo HTML5 para meu aplicativo. Eu coloquei o seguinte código para a configuração, como mostrado aqui :
return app.config(['$routeProvider','$locationProvider', function($routeProvider,$locationProvider) {
$locationProvider.html5Mode(true);
$locationProvider.hashPrefix = '!';
$routeProvider.when('/', {
templateUrl: '/views/index.html',
controller: 'indexCtrl'
});
$routeProvider.when('/about',{
templateUrl: '/views/about.html',
controller: 'AboutCtrl'
});
Como você pode ver, eu usei o $locationProvider.html5mode
e mudei todos os meus links no ng-href
para excluir o /#/
.
O problema
No momento, eu posso ir localhost:9000/
e ver a página de índice e navegar para as outras páginas como localhost:9000/about
.
No entanto, o problema ocorre quando atualizo a localhost:9000/about
página. Eu recebo a seguinte saída:Cannot GET /about
Se eu olhar para as chamadas de rede:
Request URL:localhost:9000/about
Request Method:GET
Enquanto, se eu for primeiro localhost:9000/
e clicar em um botão que navega até /about
eu recebo:
Request URL:http://localhost:9000/views/about.html
O que renderiza a página perfeitamente.
Como posso ativar o angular para obter a página correta quando atualizo?
angularjs
html
angular-routing
Dieter De Mesmaeker
fonte
fonte
Respostas:
Dos documentos angulares
A razão para isso é que, quando você visita a página pela primeira vez (
/about
), por exemplo, após uma atualização, o navegador não tem como saber que este não é um URL real, por isso segue em frente e o carrega. No entanto, se você carregou a página raiz primeiro e todo o código javascript, quando você navega para/about
Angular pode chegar lá antes que o navegador tente acessar o servidor e manipulá-lo de acordo.fonte
$routeProvider
e mudar os caminhos de cada um,templateUrl
por exemplo, detemplateUrl : '/views/about.html',
paratemplateUrl : 'example.com/views/about.html',
?Existem algumas coisas a serem configuradas para que o seu link no navegador pareça
http://yourdomain.com/path
e estas são as configurações angulares do servidor + configuração +1) AngularJS
2) no lado do servidor, basta colocar
.htaccess
dentro da pasta raiz e colarCoisas mais interessantes para ler sobre o modo html5 em angularjs e a configuração necessária para diferentes ambientes https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions#how-to-configure-your-server -to-work-with-html5mode Também esta pergunta pode ajudar você $ location / alternar entre html5 e modo de hashbang / reescrita de link
fonte
Eu tive um problema semelhante e resolvi:
Usando
<base href="https://stackoverflow.com/index.html">
na página de índiceUsando um middleware catch all route no meu nó / servidor Express da seguinte maneira (coloque-o após o roteador):
Eu acho que isso deve colocá-lo em funcionamento.
Se você usa um servidor apache, convém modificar seus links. Não é difícil de fazer. Apenas algumas alterações nos arquivos de configuração.
Tudo isso assumindo que você tenha o html5mode ativado no angularjs. Agora. observe que no angular 1.2, declarar um URL base não é mais recomendado.
fonte
<base href="https://stackoverflow.com/">
e adicionando o roteamento Express que você sugeriu. Mucho obrigado.<base href="https://stackoverflow.com/index.html">
?Solução para BrowserSync e Gulp.
Em https://github.com/BrowserSync/browser-sync/issues/204#issuecomment-102623643
Primeira instalação
connect-history-api-fallback
:Em seguida, adicione-o ao seu gulpfile.js:
fonte
server: { ... }, port: 8100
, em seguida, basta adicionar aserve
tarefa à sua tarefa de gulp padrão (por exemplogulp.task('default', ['sass', 'serve']);
) e, em seguida, você pode executar o aplicativo sem osCannot GET ...
erros do navegador quando você atualiza a página executandogulp
. Observe que a execução do servidorionic serve
ainda encontra os erros.Você precisa configurar seu servidor para reescrever tudo em index.html para carregar o aplicativo:
https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions#wiki-how-to-configure-your-server-to-work-with-html5mode
fonte
try_files $uri $uri/ /index.php?...
alternativa ao necessárioindex.html
. Obrigado pelo link!Eu escrevi um middleware de conexão simples para simular a reescrita de URL em projetos difíceis. https://gist.github.com/muratcorlu/5803655
Você pode usar assim:
fonte
$routeProvider
?urlRewrite
aviso não definido ao tentar executá-lo e estou tendo dificuldades para encontrar a conexão correta com a reescrita que posso usar.Se você estiver na pilha do .NET com o MVC com o AngularJS, é isso que você precisa 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 atualização da página "yoursite.com/about", você receberá 404. Isso ocorre porque o MVC não conhece o roteamento angular e, por padrão, o 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 os URLs
fonte
Regra de reconfiguração de URL do IIS para evitar erro 404 após a atualização da página em html5mode
Para execução angular no IIS no Windows
Rotas NodeJS / ExpressJS para evitar erro 404 após a atualização da página no html5mode
Para execução angular em Node / Express
Mais informações em: AngularJS - Ativar atualização da página no modo HTML5 sem erros 404 no NodeJS e IIS
fonte
Como já mencionado, você precisa reescrever rotas no servidor e definir
<base href="https://stackoverflow.com/"/>
.Para
gulp-connect
:npm install connect-pushstate
fonte
Estou usando o apache (xampp) no meu ambiente de desenvolvimento e o apache na produção, adicione:
para o .htaccess resolva para mim esse problema.
fonte
Para Grunt e Browsersync, use connect-modrewrite aqui
fonte
npm install connect-modrewrite --save
2.require in gruntfile
3. copie o objeto de servidor acimaEu resolvi
fonte
Estou respondendo a essa pergunta da pergunta maior:
Quando o html5Mode estiver ativado, o caractere # não será mais usado em seus URLs. O símbolo # é útil porque não requer configuração do lado do servidor. Sem #, o URL parece muito melhor, mas também requer reescritas no servidor. aqui estão alguns exemplos:
Para Express Rewrites with AngularJS, você pode resolver isso com as seguintes atualizações:
e
e
fonte
Acredito que seu problema esteja relacionado ao servidor. A documentação angular em relação ao modo HTML5 (no link da sua pergunta) afirma:
Lado do servidor O uso desse modo requer a reescrita de URL no lado do servidor, basicamente você precisa reescrever todos os seus links no ponto de entrada do seu aplicativo (por exemplo, index.html)
Acredito que você precisará configurar uma reescrita de URL de / para /.
fonte
Tivemos um redirecionamento de servidor no Express:
e ainda estávamos recebendo problemas de atualização de página, mesmo depois de adicionarmos o
<base href="https://stackoverflow.com/" />
.Solução: verifique se você está usando links reais na sua página para navegar; não digite a rota no URL ou você receberá uma atualização da página. (erro bobo, eu sei)
:-P
fonte
Finalmente, eu tenho uma maneira de resolver esse problema pelo lado do servidor, pois é mais um problema com o próprio AngularJs. Estou usando o 1.5 Angularjs e tive o mesmo problema ao recarregar a página. Mas depois de adicionar o código abaixo no meu
server.js
arquivo, ele salva meu dia, mas não é uma solução adequada ou não é uma boa maneira.fonte
Eu achei o plugin Grunt ainda melhor, que funciona se você tiver o index.html e o Gruntfile.js no mesmo diretório;
Depois disso no seu Gruntfile:
fonte
fonte
Eu tive o mesmo problema com o aplicativo java + angular gerado com o JHipster . Eu o resolvi com o filtro e a lista de todas as páginas angulares nas propriedades:
application.yml:
AngularPageReloadFilter.java
WebConfigurer.java
Espero que seja útil para alguém.
fonte
Gulp + browserSync:
Instale connect-history-api-fallback via npm, depois configure sua tarefa serve gulp
fonte
O código do lado do servidor é JAVA. Siga as etapas abaixo
Etapa 1: Faça o download do urlrewritefilter JAR Clique aqui e salve para criar o caminho WEB-INF / lib
etapa 2: ativar o modo HTML5 $ locationProvider.html5Mode (true);
Etapa 3: definir o URL base
<base href="https://stackoverflow.com/example.com/"/>
etapa 4: copie e cole no seu WEB.XML
etapa 5: criar arquivo no WEN-INF / urlrewrite.xml
fonte
Eu tenho essa solução simples que tenho usado e seus trabalhos.
Em App / Exceptions / Handler.php
Adicione isto na parte superior:
Em seguida, dentro do método de renderização
fonte
Resolvi o problema adicionando o snippet de código abaixo ao arquivo node.js.
Nota: quando atualizamos a página, ela procurará a API em vez da página Angular (por causa de nenhuma tag # no URL.). Usando o código acima, estou redirecionando para o URL com #
fonte
Basta escrever uma regra no web.config
No índice, adicione este
funciona para mim, talvez você tenha esquecido de definir o app.config do Html5Mode
fonte