在子文件夹中运行的 Angular 7 中的路由无法正常工作

2024-02-11

我们正在努力将我们的应用程序迁移到新的 Angular 版本。旧的(Angular.JS)是它自己的应用程序/存储库,由 .NET Framework 4.5.2 ASP.NET MVC 应用程序提供服务,该应用程序会将每个调用路由到Home这将返回一个包含 Angular 应用程序的 Razor 视图,然后启动它,可能会将 URL 的后缀路由到实际的 Angular 页面。例如,它将路由www.website.com/profile to the profileAngular 中的路由,而不是尝试访问名为的文件夹profile在服务器上。 集成我们的 API 和 Angular.JS 应用程序虽然不太漂亮,但很有效。服务器还在 IIS 中具有虚拟文件夹,用于存放应访问的其他子文件夹,例如字体、图像、配置等。

目前我正在努力让 Angular 7 应用程序与 Angular.JS 应用程序一起运行。我们希望运行 Angular 7 应用程序以在当前应用程序的目录中运行,然后将其移动到它自己的 Web 应用程序,因为我们新的 Angular 应用程序只是一堆静态文件,不需要与服务器捆绑在一起不再了。基本上不需要任何 ASP.NET MVC 配置。

当前的网址将是www.website.com并返回 Angular.JS 应用程序。新的将是www.website.com/v2/并将返回 Angular 7 应用程序。如果我们完成了 v2 版本profile页面,导航至wwww.website.com/v2/profile现在应该导航到profileAngular 7 应用程序的页面。

在 IIS 中,虚拟文件​​夹之一是名为的文件夹dist这导致 Angular.JS 应用程序文件的位置。一个新的叫v2现在已配置,这将导致 Angular 7 应用程序文件的位置。另一个叫assets导致assetsAngular 7 应用程序的文件夹。

现在,当我导航到www.website.com/v2/,Angular 启动并将我引导至www.website.com/v2/home,这是家乡路线。

问题当我输入时www.website.com/v2/home我自己,这会导致应用程序路由回www.website.com。因此它会再次启动 Angular.JS 应用程序。没有发生错误或重定向。看起来它只是忽略了后面的部分v2/尽管 Angular.JS 做得很好。

TL;DR导航至www.website.com/v2加载 Angular 7,但导航到v2/{{Anything}}导致应用程序回退到运行在 Angular.JS 应用程序上www.website.com,即使如果{{anything}}是 Angular 7 中的内部链接,它would导航至{{anything}} route.

我使用以下命令构建 Angular 项目:

ng build --configuration=dev --deploy-url=/v2/ --base-href=/v2/

Angular 7 应用程序中的路线如下所示:

const routes: Routes = [
  {
    path: '',
    redirectTo: 'home',
    pathMatch: 'full',
  },
  {
    path: '',
    canActivate: [AuthGuard],
    component: DefaultLayoutComponent,
    children: [
      {
        path: 'home',
        component: DashboardComponent,
        canLoad: [NoAuthGuard],
      },
      {
        path: 'contact',
        loadChildren: './modules/contact/contact.module#ContactModule',
        canLoad: [NoAuthGuard],
      },
      {
        path: 'timesheets',
        loadChildren: './modules/timesheet/timesheet.module#TimesheetModule',
        canLoad: [NoAuthGuard],
      },
      {
        path: 'users',
        loadChildren: './modules/users/users.module#UsersModule',
        canLoad: [NoAuthGuard, NgxPermissionsGuard],
        data: {
          permissions: {
            only: 'seeUsersPage',
            redirectTo: '/403',
          },
        },
      },
      {
        path: 'profile',
        loadChildren: './modules/profile/profile.module#ProfileModule',
        canLoad: [NoAuthGuard],
      },
    ],
  },
  {
    path: 'login',
    component: LoginComponent,
  },
  {
    path: '403',
    component: Page403Component,
  },
  {
    path: '**',
    redirectTo: '/home',
    pathMatch: 'full',
  },
];

谁能告诉我如何制作,例如打字www.website.com/v2/contact浏览器中的 通向 v2 联系页面,同时还可以进行内部导航(因此,如果用户单击 Angular 7 应用程序内部的“导航到 v2 联系页面”,它也会导航到 v2 联系页面)

编辑:有关 Angular.JS 的信息Routerconfig和后端web.config被要求;我在下面提供了它们。

RouterConfig:

$routeProvider
    .when('/', {
      templateUrl: 'scripts/home/home.html',
      controller: 'HomeController',
      controllerAs: 'homeCtrl'
    })
    .when('/gebruikers', {
      templateUrl: 'scripts/users/users.html',
      controller: 'UsersController',
      controllerAs: 'usersCtrl'
    })
    .when('/profiel', {
      templateUrl: 'scripts/profile/profile.html',
      controller: 'ProfileController',
      controllerAs: 'profileCtrl'
    })
    .when('/timesheets', {
      templateUrl: 'scripts/timesheets/timesheets.html',
      controller: 'TimesheetsController',
      controllerAs: 'timesheetsCtrl',
      reloadOnSearch: false
    })
    .when('/facturen', {
      templateUrl: 'scripts/invoices/invoices.html',
      controller: 'InvoicesController',
      controllerAs: 'invoicesCtrl',
      reloadOnSearch: false
    })
    .when('/opdrachten', {
      templateUrl: 'scripts/vacancies/vacancies.html',
      controller: 'VacanciesController',
      controllerAs: 'vacanciesCtrl'
    })
    .when('/contact', {
      templateUrl: 'scripts/contact/contact.html',
      controller: 'ContactController',
      controllerAs: 'contactCtrl'
    })
    .when('/help', {
      templateUrl: 'scripts/help/help.html',
      controller: 'HelpController',
      controllerAs: 'helpCtrl'
    })
    .otherwise({
      redirectTo: '/'
    });

Web.Config IIS rewrite rules:

 <rewrite>
      <rules>
        <clear />
        <rule name="Redirect Angular endpoints to MVC Home" enabled="true">
          <match url="^(profiel|timesheets|facturen|opdrachten|contact|help|gebruikers)" negate="false" />
          <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
          <action type="Rewrite" url="Home" logRewrittenUrl="false" />
        </rule>
     <!-- Some other rules that are not important are here, they redirect HTTP to HTTPS -->
     </rules>
  </rewrite>

它总是路由回 v1 url 的原因是因为 Angular 7 应用程序包含一个web.config文件看起来像这样:

<configuration>
    <system.webServer>
      <rewrite>
        <rules>
          <rule name="Angular" stopProcessing="true">
            <match url=".*" />
            <conditions logicalGrouping="MatchAll">
              <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
              <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
            </conditions>
            <action type="Rewrite" url="/" />
          </rule>
        </rules>
      </rewrite>
    </system.webServer>
</configuration>

我相信这是 IIS 部署的默认设置,团队成员可能已添加此设置。我从来没有想过在前端项目中拥有一个 web.config。

基本上,此规则负责将用户重新路由到index.html。例如www.website.com/folder通常会将用户带到名为的文件夹folder在网络服务器上,但这不是 Angular 运行的地方,可能会导致 404。此规则使用户返回www.website.com然后让 Angular 路由folder part.

因为我在子文件夹中运行应用程序,所以我更改了url="/" to url="/v2/"它立即起作用了!

请记住使用以下命令构建项目ng build --configuration=dev --deploy-url=/v2/ --base-href=/v2/!需要deploy-url,因为在服务器根文件夹中找不到scripts/css/other文件;它位于 /v2/ 中。 base-href 对于路由器来说是必需的;它应该开始路由应用程序www.website.com/v2/并且不在www.website.com/!

不需要其他 iis 重写规则,不需要 asp.net 配置,不需要特殊的角度路由。只需这些简单的步骤!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在子文件夹中运行的 Angular 7 中的路由无法正常工作 的相关文章

  • html 图像 src 调用 javaScript 变量

    这是我的代码 我想问 我怎样才能做到这一点 img src img apple 我一直在尝试使用 call 函数和 document onload 但它根本不起作用 有人可以救我吗 我假设你只是想用 javascript 更新图像 src
  • 为动态加载的 HTML 内容触发 Bootstrap JS 行为

    我正在动态加载包含 Bootstrap 标记的 HTML 模板 但是 Bootstrap Javascript 行为不会应用于加载的内容 例如 如果加载的内容包含 Bootstrap 模式的标记 则该模式将无法正确运行 有没有办法可以触发
  • jslint 配置 |传递全局变量

    我如何提醒 jshint 我有全局变量 即命名它们 我知道你可以做到这一点 但我不记得语法了 我在这里定义了一个全局的 function window glob1 local var 稍后像这样使用 不同的 IIFE function gl
  • jquery 中可点击 div 中的按钮

    我有整个 div 您可以单击它来切换该 div 的主要部分 问题是我在该 div 中也有可点击的按钮 当我点击它时 它会执行它应该做的事情 但同时也会切换整个 div 我怎样才能禁用它 Use event stopPropagation 单
  • 如何为WCF服务创建重定向?

    我的网站 A 上托管了一个 WCF 服务 我还有另一个网站 B 它使用 IIS URL 重写将所有请求重定向到我的网站 A 但是 站点 B 不处理任何对 svc 文件的请求 返回 404 not find 知道如何让它发挥作用吗 UPD重定
  • 使用 Javascript/Node.js 在代码内执行 mongoimport

    node js javascript 中是否有任何库可供个人使用mongoimport在代码中 据我了解 mongoimport 有点像 exe 您必须先执行它 然后才能使用其文本输入环境 是否可以在我的代码中执行 mongoimport
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • IE localStorage 事件失火

    在 Internet Explorer 9 和 10 中 localStorage 实现意外地触发事件 这里有很棒的线索 Chrome 的 localStorage 实现存在错误 https stackoverflow com questi
  • JQuery $.ajax() 在 java servlet 中发布数据

    我想将数据发送到 java servlet 进行处理 数据将具有可变长度并采用键 值对 A1984 1 A9873 5 A1674 2 A8724 1 A3574 3 A1165 5 数据不需要这样格式化 这就是我现在的方式 var sav
  • Javascript location.href 到 mailto 触发 GET HTTP,该 HTTP 在 Chrome 中被取消

    我有一个按钮可以触发以下 javascript 函数 function sendEmail var mail mailto email protected cdn cgi l email protection location href m
  • 在 Chrome 开发者工具中禁用调试器语句

    我正在尝试对恶意 JavaScript 进行逆向工程 当我最初加载侧面时 会注入 JS 代码 其中包括 debugger 语句并将断点注入我的 chrome 开发人员控制台 通过stackoverflow阅读 禁用所有断点does not帮
  • Mat-自动完成表单控件名称

    我在 Mat Autocomplete 上使用 formControlName 时遇到问题 我不知道为什么 但我的 formControlName 不会发送数据 我是否写错了 当我尝试从 HTML 中删除 formControl 时 它总是
  • ES6 静态方法引用 self? [复制]

    这个问题在这里已经有答案了 我有两节课 存储库和用户存储库 我想在 Repository 中定义一个静态方法 该方法在运行时调用 UserRepository 中的静态函数 有什么干净的方法可以做到这一点吗 class Repository
  • 如何使用 Javascript 在 html 文件中搜索字符串?

    我有 5 个 html 文件 并且有一个搜索表单 我想用它来搜索这些 html 文件中的文本
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • Javascript等待/异步执行顺序

    所以我试图把我的头脑集中在 Promise await async 上 我不明白为什么当 go 执行时 带有 finished 的警报会紧随 console log coffee 之后 当所有函数都使用等待 承诺时 为什么它只等待 getC
  • 根据文本内容从 jquery 对象中过滤元素

    我正在尝试使用contains带有 this 关键字 但它给出了错误 JS function var check ul find li filter function return this contains two css color r
  • Html5画布最热门的任意形状

    我正在尝试开发可以在画布中渲染图像和文本的程序 我尝试处理画布中图像的点击 但它适用于可矩形图像 我的问题 您是否知道处理单击画布中图像的可见部分 非透明部分 的解决方案或框架 我正在寻找 ActionScript hitTestObjec
  • Safari 扩展将消息发送到特定选项卡

    有没有办法从全局页面发送消息到特定选项卡 我目前正在做的是 在创建选项卡时 注入的脚本会创建一个唯一的 ID 并将包含该编号的消息发送到全局页面 并且全局页面会保存该编号 如果全局页面需要发送一些数据到一个tab 即 tab 3 然后全局页
  • 使用
    元素作为 JavaScript 代码的输入。这是最好的方法吗?

    各位 显然 我是编码新手 所以最近完成了一些有关 HTML 和 Javascript 的 Lynda 课程后 我的简单 HTML 页面遇到了困难 基本上 我想要的是使用 JavaScript 进行基本计算 让用户使用 HTML 输入两个数字

随机推荐

  • COUNT(*) 什么时候返回 NULL?

    你好 我有一个经常写信的同事ISNULL COUNT 0 但我一直以为COUNT 永远无法返回NULL 但后来我搜索了互联网 我的发现让我能够编写这段小代码 create table t1 val1 varchar 50 select co
  • 如何在NativeScript中访问android的R对象?

    我正在尝试访问 Android 的R我用 Angular 在 NativeScript 中尝试了一个对象 但我没有取得任何成功 说明here https www nativescript org blog using android bac
  • 如何在Anaconda下使用非mkl NumPy?

    Anaconda Python 发行版使用针对 Intel MKL 库编译的 NumPy 和相关包 而不是 标准 NumPy 如何在特定 conda 环境上将 Anaconda 与 标准 NumPy 一起使用 不幸的是 目前还不能选择使用其
  • 为什么我的调试器因仅指向 main.js 的链接而损坏

    我正在努力调试我的角度应用程序 这是我继承的一个应用程序 并努力寻找它无法工作的原因 当我尝试调试我的项目时 打开 chrome 调试器 我得到的只是对 main js 的引用 当我单击这些时 它不会将我带到正确的源代码行 正如评论中指出的
  • 如何将数据库中的所有表更改为UTF8字符集?

    我的数据库不是 UTF8 我想将所有表转换为 UTF8 我该怎么做 对于单表 你可以这样做 ALTER TABLE tab CONVERT TO CHARACTER SET utf8 COLLATE utf8 unicode ci 对于整个
  • ASP.net MVC 支持带有连字符的 URL

    有没有一种简单的方法可以让 MvcRouteHandler 将传入 URL 的操作和控制器部分中的所有连字符转换为下划线 因为方法或类名称中不支持连字符 这样我就可以支持诸如 example com test page edit detai
  • PHP - 最轻量级的 psr-0 兼容自动加载器

    我有一个小型应用程序 我需要一个自动加载器 我可以轻松地使用 symfony2 类加载器 但这似乎有点矫枉过正 是否有稳定且超轻量的 psr 0 自动装载机 你要求非常轻量 让我们这样做吧 Timothy Boronczyk 写了一个很好的
  • ASP.NET MVC3 - 使用 DependencyResolver 和温莎城堡:为什么?

    有人能为我点亮一点光吗 我的网站全部使用温莎城堡运行 我有一个控制器工厂以及控制器和服务的安装程序 一切都很好 现在我刚刚创建了一个IDependencyResolver实现类称为WindsorDependencyResolver直接实施
  • iOS 8 远程通知 - 我什么时候应该调用 registerForRemoteNotifications()?

    正如苹果关于推送通知的官方信息页面所述 设备令牌可能会更改 因此您的应用程序需要重新注册每次启动时 我试图理解他们所说的 每次启动 是什么意思 这是否意味着我必须在 AppDelegate 中的 didFinishLaunchingWith
  • Firebase Firestore 与侦听器的成本

    有几个与消防成本相关的问题 但我找不到能够澄清我脑海中问题的问题 我有两个案例 我想知道每种情况下的估计成本 文档读取次数 假设我有一个显示 10 个用户的一页应用程序 打开应用程序会将侦听器附加到 userList 集合并侦听该集合中的
  • 具有纤薄框架的读取令牌

    我正在使用 SlimFramework 和 JWT 来处理基于登录名和密码的基于令牌的身份验证 我成功登录并发送令牌作为响应 这是我的代码
  • 在 Hive 中创建临时表?

    Hive 支持临时表吗 我在 apache 文档中找不到它 从 Hive 0 14 0 开始感谢 hwrdprkns 的评论 从 Hive 0 14 0 开始 支持临时表https cwiki apache org confluence d
  • ASP.NET MVC RC - 使用代码隐藏创建 MVC 用户控件

    尝试在候选版本中创建一个 MVC 用户控件 但我无法使用代码隐藏文件来创建一个 MVC 视图页面也是如此 在 Beta 版中创建视图会产生代码隐藏 我错过了什么吗 代码隐藏有点违背了 MVC 框架的目的 功能应该与视图分离 MVC 团队认为
  • 确保 C++ 中的 OpenGL 兼容类型

    OpenGL 缓冲区对象支持各种明确定义宽度的数据类型 GL FLOAT是32位的 GL HALF FLOAT是16位的 GL INT是 32 位 如何确保 OpenGL 的跨平台和面向未来的类型 例如 喂食float数据从 C 数组到缓冲
  • .NET 中通过 Process.Start 生成的进程会挂起线程

    我们的应用程序有一个后台线程 它通过以下方式生成一个进程System Diagnostics Process Process Start new ProcessStartInfo FileName url UseShellExecute t
  • Java 运行时 ClassNotFoundException

    只是有一个关于我遇到的奇怪的运行时错误的问题 我正在使用一个 JSON 服务器 当外部源提示时 该服务器会响应 JSON 对象 然而 到目前为止 我只是尝试在发送 JSON 对象之前启动并运行它 我的代码编译时没有指定任何类路径 但是当涉及
  • Java 8 forEach 带索引[重复]

    这个问题在这里已经有答案了 有没有办法建立一个forEachJava 8 中使用索引迭代的方法 理想情况下我想要这样的东西 params forEach idx e gt query bind idx e 我现在能做的最好的事情就是 int
  • MySQL 5.7 无法匹配两个汉字

    表TB title keywords 企业贷款 该如何看懂银行流水 出口退税 贷款 现金流量表 利润表 最高人民法院关于审理民间 企业贷款 合同法 贷款 中国宏观经济数据点评 企业贷款 贷款 ngram token size 2 FULLT
  • iOS Swift didBeginContact 没有被调用

    这两天我一直在努力让两个SKSpriteNode注册碰撞并唤起didBegin contact 我已经设置了他们的位掩码 categoryBitMask contactTestBitMask and collisionTestBitMask
  • 在子文件夹中运行的 Angular 7 中的路由无法正常工作

    我们正在努力将我们的应用程序迁移到新的 Angular 版本 旧的 Angular JS 是它自己的应用程序 存储库 由 NET Framework 4 5 2 ASP NET MVC 应用程序提供服务 该应用程序会将每个调用路由到Home