Angularjs 如何使html5Mode应用程序与根相关而不是与服务器根相关

Angularjs 如何使html5Mode应用程序与根相关而不是与服务器根相关,angularjs,iis,url-rewriting,Angularjs,Iis,Url Rewriting,为了帮助SEO和深度链接,我在angular项目中打开了HTML5模式,如下所示: index.html web.config 我的IIS Express调试根目录是http://localhost:10223我的本地开发人员根目录是http://myvirtualmachine/webapplicationname /webapplicationname/在我的调试设置中不存在。在过去的开发环境中,它也不存在。但有人告诉我,任何环境都可能不在根目录下,或者位于web应用程序文件夹中,其

为了帮助SEO和深度链接,我在angular项目中打开了HTML5模式,如下所示:

index.html

web.config


我的IIS Express调试根目录是
http://localhost:10223
我的本地开发人员根目录是
http://myvirtualmachine/webapplicationname

/webapplicationname/
在我的调试设置中不存在。在过去的开发环境中,它也不存在。但有人告诉我,任何环境都可能不在根目录下,或者位于web应用程序文件夹中,其名称我无法控制,因此我无法依赖或创建模式

我只想使用
/
作为我的
基础。如果我这样做了,它将在调试中工作。我希望在其他环境中使用该功能,而不管web应用程序相对于web服务器根位于何处

目前,如果我将根目录更改为
/
,如
/
指向本地开发环境中的错误位置。它将指向
http://myvirtualmachine/
而不是
http://myvirtualmachine/webapplicationname
,这将导致404s。它需要指向我的应用程序的根,而不是web服务器的根


如何在此处获得类似于
~/
-的功能?

您可以使用$locationProvider,而不是更改基础

$locationProvider.html5Mode({
  enabled: true,
  requireBase: false
});

这应该对你有帮助

您可以使用$locationProvider,而不是更改基数,如

$locationProvider.html5Mode({
  enabled: true,
  requireBase: false
});

这应该对你有帮助

以下是我为使这项工作正常进行所做的工作。如果有人有更干净的方法,请告诉我

正如Rabi所说,我确实关闭了
requireBase
,我认为如果您动态创建基础,这会有所帮助

  $locationProvider.html5Mode({
    enabled: true,
    requireBase: false
  });
我不是在
,而是在
html head
元素中的同一位置执行此操作:

  <script type="text/javascript">
    var firstPathPart = document.location.pathname.split("/")[1];
    var href;
    switch (firstPathPart) {
      case '':
      case 'login':
      case 'forgot-password':
      case 'activation':
      case 'home':
      case 'mymainmenu1':
      case 'mymainmenu2':
      case 'profile':
        href = '/';
        break;
      default:
        href = '/' + firstPathPart + '/';
    };
    document.write("<base href='" + href + "' />");
  </script>

var firstPathPart=document.location.pathname.split(“/”[1];
var href;
交换机(firstPathPart){
案例“”:
案例“登录”:
案例“忘记密码”:
案例“激活”:
“家”案例:
案例“mymainmenu1”:
案例“mymainmenu2”:
个案‘简介’:
href='/';
打破
违约:
href='/'+firstPathPart+'/';
};
文件。填写(“”);
基本上是说动态地写基。写基指向url路径的第一段,除非这恰好是我的顶级角度路径之一,在这种情况下,使根
/

在web.config中,我保留了对
/webapplicationname/
的引用。这在我们的商店是允许的,因为
web.config
被认为是特定于环境的。因此,它可以随环境的不同而变化,并且可以包含单独的设置进行管理


我为什么要这样做?因为我们的商店不接受在不同的环境中使用不同的东西
index.html
是源代码,不是配置。源代码在每个环境中都必须是相同的,尽管像
web.config
这样的设置文件是允许变化的。

以下是我为实现这一点所做的工作。如果有人有更干净的方法,请告诉我

正如Rabi所说,我确实关闭了
requireBase
,我认为如果您动态创建基础,这会有所帮助

  $locationProvider.html5Mode({
    enabled: true,
    requireBase: false
  });
我不是在
,而是在
html head
元素中的同一位置执行此操作:

  <script type="text/javascript">
    var firstPathPart = document.location.pathname.split("/")[1];
    var href;
    switch (firstPathPart) {
      case '':
      case 'login':
      case 'forgot-password':
      case 'activation':
      case 'home':
      case 'mymainmenu1':
      case 'mymainmenu2':
      case 'profile':
        href = '/';
        break;
      default:
        href = '/' + firstPathPart + '/';
    };
    document.write("<base href='" + href + "' />");
  </script>

var firstPathPart=document.location.pathname.split(“/”[1];
var href;
交换机(firstPathPart){
案例“”:
案例“登录”:
案例“忘记密码”:
案例“激活”:
“家”案例:
案例“mymainmenu1”:
案例“mymainmenu2”:
个案‘简介’:
href='/';
打破
违约:
href='/'+firstPathPart+'/';
};
文件。填写(“”);
基本上是说动态地写基。写基指向url路径的第一段,除非这恰好是我的顶级角度路径之一,在这种情况下,使根
/

在web.config中,我保留了对
/webapplicationname/
的引用。这在我们的商店是允许的,因为
web.config
被认为是特定于环境的。因此,它可以随环境的不同而变化,并且可以包含单独的设置进行管理


我为什么要这样做?因为我们的商店不接受在不同的环境中使用不同的东西
index.html
是源代码,不是配置。源代码在每个环境中都必须是相同的,尽管像
web.config
这样的设置文件是允许变化的。

它对您有帮助吗?它对您有帮助吗?因此,我是否可以从index.html中删除基本标记?是的,如果您将requireBase设置为false,您不需要定义基本url。因此,我会从index.html中删除基标记吗?是的,如果将requireBase设置为false,则不需要定义基url。