Tenemos una aplicación empresarial que usa Angular 2 para el cliente. Cada uno de nuestros clientes tiene su propia URL única, por ejemplo, https://our.app.com/customer-one
y https://our.app.com/customer-two
. Actualmente podemos configurar <base href...>
dinámicamente usando document.location
. Así que el usuario toca https://our.app.com/customer-two
y <base href...>
se prepara para /customer-two
... ¡perfecto!
El problema es que si el usuario está, por ejemplo, en https://our.app.com/customer-two/another-page
y actualiza la página o intenta acceder a esa URL directamente, <base href...>
se configura en /customer-two/another-page
y no se pueden encontrar los recursos.
Hemos intentado lo siguiente en vano:
<!doctype html>
<html>
<head>
<script type='text/javascript'>
var base = document.location.pathname.split('/')[1];
document.write('<base href="https://stackoverflow.com/' + base + '" />');
</script>
...
Desafortunadamente, no tenemos ideas. Cualquier ayuda sería asombrosa.
Respuestas:
La respuesta marcada aquí no resolvió mi problema, posiblemente diferentes versiones angulares. Pude lograr el resultado deseado con el siguiente
angular cli
comando en terminal / shell:ng build --base-href /myUrl/
ng build --bh /myUrl/
ong build --prod --bh /myUrl/
Esto cambia el
<base href="https://stackoverflow.com/">
a solo<base href="https://stackoverflow.com/myUrl/">
en la versión construida, que fue perfecta para nuestro cambio de entorno entre desarrollo y producción. La mejor parte fue que ninguna base de código requiere cambiar usando este método.Para resumir, deje su
index.html
href base como:<base href="https://stackoverflow.com/">
luego ejecuteng build --bh ./
con angular cli para convertirlo en una ruta relativa, o reemplace el./
con lo que necesite.Actualizar:
Como el ejemplo anterior muestra cómo hacerlo desde la línea de comando, aquí se explica cómo agregarlo a su archivo de configuración angular.json.
Esto se utilizará para todos
ng serving
para el desarrollo local.Esta es la configuración específica para compilaciones de configuración como prod:
La documentación oficial
angular-cli
referente al uso.fuente
./
funciona para todas las ubicaciones. Entonces, en realidad, no creo que tengas que construir por cliente../
ha sido muy diferente. Funciona hasta que el usuario navega a una ruta y presiona el botón o las teclas de actualización del navegador. En ese momento, nuestras reescrituras manejan la llamada, sirven la página de índice, pero el navegador asume que esa./
es la ruta actual, no la carpeta raíz de la aplicación web. Resolvimos el problema del OP con un índice dinámico (.aspx, .php, .jsp, etc.) que establece el href base.--prod
durante la compilación no cambiará subase href
valor, no debe hablar de ello aquí.--prod
le diceangular-cli
que use elenvironment.prod.ts
archivo en lugar del archivo predeterminadoenvironment.ts
en suenvironments
carpeta--prod
bandera, ya que estaban hablando de implementación en el OP.Esto es lo que terminamos haciendo.
Agregue esto a index.html. Debería ser lo primero en la
<head>
secciónLuego, en el
app.module.ts
archivo, agregue{ provide: APP_BASE_HREF, useValue: window['_app_base'] || '/' }
a la lista de proveedores, así:fuente
useValue: (window as any) ['_app_base'] || '/'
ayudaSegún su respuesta (@sharpmachine), pude refactorizarlo un poco más, para que no tengamos que piratear una función en
index.html
.Y
./shared/common-functions.util.ts
contiene:fuente
http://localhost:8080/subfolder/myapp/#/subfolder/myroute
¿Así es la tuya? ¿Sabes cómo deshacerte de la subcarpeta después del # para que pueda serhttp://localhost:8080/subfolder/myapp/#/myroute
?base href
solo es necesario paraLocationStrategy
AFAIK. En cuanto a escribir código especial para manejar la actualización con LocationStrategy, no estoy seguro de lo que quiere decir exactamente. ¿Estás preguntando qué pasa si mi "href base" cambia durante una actividad en mi aplicación? Entonces, sí, tuve que hacer algo sucio comowindow.location.href = '/' + newBaseHref;
dónde se requería cambiarlo. No estoy muy orgulloso de eso. Además, para dar una actualización, me alejé de estas soluciones de pirateo en mi aplicación, ya que se estaba convirtiendo en un problema de diseño para mí. Los parámetros del enrutador funcionan perfectamente bien, así que me quedé con ellos.appRoutingProvider
ves, Krishnan? Veo que la respuesta aceptada se usó igual; tal vez solo hayas copiado el suyoproviders
, pero si no, ¿puedes darme una muestra o describir su propósito? La documentación soloimports
módulos de enrutamiento , no utiliza ningún proveedor relacionado con el enrutamiento (por lo que puedo ver)location /subfolder/myapp/ { try_files $uri /subfolder/myapp/index.html; } location /subfolder2/myapp/ { try_files $uri /subfolder2/myapp/index.html; }
Utilizo el directorio de trabajo actual
./
cuando construyo varias aplicaciones desde el mismo dominio:En una nota al margen, utilizo
.htaccess
para ayudar con mi enrutamiento en la recarga de la página:fuente
.htaccess
archivo<base href="./">
está mal y arruinará las rutas como/app/a/b/c
, de hecho, lo acabo de probar. Prefiera configurar el href base usted mismo si se trata solo de una aplicación web o eche un vistazo a la forma angular de cambiar el href base en la implementación (aquí hay muchas respuestas que mencionan esto).Simplificación de la respuesta existente por @sharpmachine .
No tiene que especificar una etiqueta base en su index.html, si está proporcionando valor para el token opaco APP_BASE_HREF.
fuente
Esto funciona bien para mí en el entorno de producción.
fuente
En angular4, también puede configurar baseHref en aplicaciones .angular-cli.json.
en .angular-cli.json
esto actualizará el href base en index.html a MY_APP_BASE_HREF_1
fuente
Si está utilizando Angular CLI 6, puede usar las opciones deployUrl / baseHref en angular.json (proyectos> xxx> arquitecto> compilación> configuraciones> producción). De esta manera, puede especificar fácilmente la baseUrl por proyecto.
Compruebe que su configuración sea correcta mirando el index.html de la aplicación construida.
fuente
Complementos: si desea, por ejemplo: / users como base de la aplicación para enrutador y / public como base para el uso de activos
fuente
Tuve un problema similar, de hecho terminé probando la existencia de algún archivo dentro de mi web.
probePath sería la URL relativa al archivo que desea verificar (una especie de marcador si ahora se encuentra en la ubicación correcta), por ejemplo, 'assets / images / thisImageAlwaysExists.png'
fuente
En package.json, establezca el indicador --base-href en la ruta relativa:
fuente
Hablando francamente, ¡tu caso me funciona bien!
Estoy usando Angular 5.
fuente
Acabo de cambiar:
a esto:
no olvides terminar con /
fuente