Temos um aplicativo corporativo que usa o Angular 2 para o cliente. Cada um de nossos clientes possui seu próprio URL exclusivo, ex: https://our.app.com/customer-one
e https://our.app.com/customer-two
. Atualmente, somos capazes de definir o <base href...>
uso dinâmico document.location
. Assim, o usuário acessa https://our.app.com/customer-two
e <base href...>
é configurado para /customer-two
... perfeito!
O problema é que, por exemplo, o usuário está em https://our.app.com/customer-two/another-page
e atualiza a página ou tenta acessar diretamente esse URL, o <base href...>
conjunto é definido /customer-two/another-page
e os recursos não podem ser encontrados.
Tentamos o seguinte sem sucesso:
<!doctype html>
<html>
<head>
<script type='text/javascript'>
var base = document.location.pathname.split('/')[1];
document.write('<base href="https://stackoverflow.com/' + base + '" />');
</script>
...
Infelizmente, estamos sem idéias. Qualquer ajuda seria incrível.
Respostas:
A resposta marcada aqui não resolveu meu problema, possivelmente versões angulares diferentes. Consegui alcançar o resultado desejado com o seguinte
angular cli
comando no terminal / shell:ng build --base-href /myUrl/
ng build --bh /myUrl/
oung build --prod --bh /myUrl/
Isso muda apenas
<base href="https://stackoverflow.com/">
para<base href="https://stackoverflow.com/myUrl/">
a versão criada, o que foi perfeito para nossa mudança no ambiente entre desenvolvimento e produção. A melhor parte foi que nenhuma base de código requer alteração usando esse método.Para resumir, deixe seu
index.html
href base como:<base href="https://stackoverflow.com/">
então executeng build --bh ./
com angular cli para torná-lo um caminho relativo ou substitua-o./
pelo que você precisar.Atualizar:
Como o exemplo acima mostra como fazer isso na linha de comando, veja como adicioná-lo ao seu arquivo de configuração angular.json.
Isso será usado para todos
ng serving
no desenvolvimento localEsta é a configuração específica para compilações de configurações, como prod:
A documentação oficial
angular-cli
referente ao uso.fonte
./
funciona para todos os locais. Então, na verdade, acho que você não precisa criar por cliente../
foi muito diferente. Ele funciona até o usuário navegar para uma rota e pressionar o botão ou as teclas de atualização do navegador. Nesse ponto, nossas regravações lidam com a chamada, veiculam a página de índice, mas o navegador assume que essa./
é a rota atual e não a pasta raiz do aplicativo Web. Resolvemos o problema do OP com um índice dinâmico (.aspx, .php, .jsp, etc) que define o href base.--prod
durante a compilação não altera seubase href
valor, você não deve falar sobre isso aqui.--prod
dizangular-cli
para usar oenvironment.prod.ts
arquivo em vez do arquivo padrãoenvironment.ts
na suaenvironments
pasta--prod
sinalizador, pois eles estavam falando sobre a implantação no OP.Aqui está o que acabamos fazendo.
Adicione isso ao index.html. Deve ser a primeira coisa na
<head>
seçãoEm seguida, no
app.module.ts
arquivo, adicione{ provide: APP_BASE_HREF, useValue: window['_app_base'] || '/' }
à lista de provedores, assim:fonte
useValue: (window as any) ['_app_base'] || '/'
ajudaCom base na sua resposta (@sharpmachine), fui capaz de refatorá-la um pouco mais, para que não precisemos hackear uma função
index.html
.E
./shared/common-functions.util.ts
contém:fonte
http://localhost:8080/subfolder/myapp/#/subfolder/myroute
é assim que o seu se parece? Você sabe como se livrar da subpasta após o # para que possa serhttp://localhost:8080/subfolder/myapp/#/myroute
?base href
é necessário apenas para oLocationStrategy
AFAIK. Quanto à gravação de código especial para lidar com a atualização com o LocationStrategy, não tenho certeza do que você quer dizer exatamente. Você está perguntando, e se meu "href base" for alterado durante uma atividade no meu aplicativo? Então, sim, eu tive que fazer uma coisa suja, comowindow.location.href = '/' + newBaseHref;
onde era necessário mudar. Não tenho muito orgulho disso. Além disso, para dar uma atualização, eu me afastei dessas soluções de hackers no meu aplicativo, pois estava se tornando um problema de design para mim. Os parâmetros do roteador funcionam perfeitamente bem, por isso fiquei atento.appRoutingProvider
aparência, Krishnan? Vejo que a resposta aceita é a mesma; talvez você tenha copiado o deleproviders
, mas, se não, pode me dar uma amostra ou descrever seu propósito? A documentação apenasimports
módulos de roteamento , ele não usa quaisquer provedores de roteamento relacionadas (tanto quanto eu posso ver)location /subfolder/myapp/ { try_files $uri /subfolder/myapp/index.html; } location /subfolder2/myapp/ { try_files $uri /subfolder2/myapp/index.html; }
Eu uso o diretório de trabalho atual
./
ao criar vários aplicativos no mesmo domínio:Em uma nota lateral, eu uso
.htaccess
para ajudar no meu roteamento na página recarregada:fonte
.htaccess
arquivo<base href="./">
está errado e vai estragar tudo com rotas como de/app/a/b/c
fato, apenas testei. Prefira definir você mesmo o href base se estiver lidando apenas com um aplicativo da Web ou dê uma olhada na maneira angular de alterar o href base na implantação (existem muitas respostas aqui mencionando isso).Simplificação da resposta existente por @sharpmachine .
Você não precisa especificar uma tag base em seu index.html, se estiver fornecendo valor para o token opaco APP_BASE_HREF.
fonte
Este trabalho é bom para mim no ambiente prod
fonte
No angular4, você também pode configurar o baseHref nos aplicativos .angular-cli.json.
em .angular-cli.json
isso atualizará o href base em index.html para MY_APP_BASE_HREF_1
fonte
Se você estiver usando o Angular CLI 6, poderá usar as opções deployUrl / baseHref em angular.json (projetos> xxx> arquiteto> construção> configurações> configurações> produção). Dessa forma, você pode especificar facilmente o baseUrl por projeto.
Verifique se suas configurações estão corretas, consultando o index.html do aplicativo criado.
fonte
Complementos: se você quiser, por exemplo: / users como base de aplicativos para roteador e / public como base para uso de ativos
fonte
Tive um problema semelhante, na verdade, acabei investigando a existência de algum arquivo na minha web.
probePath seria o URL relativo ao arquivo que você deseja procurar (tipo de marcador se você estiver no local correto), por exemplo, 'assets / images / thisImageAlwaysExists.png'
fonte
Francamente falando, seu caso funciona bem para mim!
Estou usando o Angular 5.
fonte
Acabei de mudar:
para isso:
não esqueça de terminar com /
fonte