如何让html5Mode应用程序成为root相对而不是服务器root相对

时间:2015-11-15 23:17:44

标签: angularjs iis url-rewriting

为了帮助SEO和深层链接,我在我的角度项目中启用了html 5模式,如下所示:

的index.html

<base href="/webapplicationname/">

app.js

  // use the HTML5 History API
  $locationProvider.html5Mode(true);

的web.config

  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Main Rule" 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="/webapplicationname/" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>

我的IIS Express调试根目录是http://localhost:10223,我的本地dev根目录是http://myvirtualmachine/webapplicationname

我的调试设置中不存在

/webapplicationname/。它也不存在于开发者之后的其他环境中。但是传给我的是,任何环境都可能不在根目录中,或者位于我无法控制的名称的Web应用程序文件夹中,因此我无法指望或制作模式。

我想将/用作我的base。如果我这样做,它将在调试中起作用。我想在其他环境中使用该工作,无论Web应用程序相对于Web服务器根目录的位置如何。

就目前而言,如果我将根更改为/,如<action type="Rewrite" url="/" /><base href="/">,则/指向我本地开发环境中的错误位置。它会指向http://myvirtualmachine/而不是http://myvirtualmachine/webapplicationname,这将导致404。它需要指向我的应用的根,而不是Web服务器的根!

如何在此处获得~/类功能?

2 个答案:

答案 0 :(得分:0)

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

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

这应该对你有所帮助。

答案 1 :(得分:0)

以下是我为此工作所做的工作。如果有人有更清洁的方式,请告诉我。

我确实关闭了requireBase,正如拉比说的那样,如果你动态创建基地,我认为这会有所帮助。

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

而不是<base href="WhateverTheApplicationRootIs" />,我在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>

基本上说是动态写入基数。将基数写入指向url路径的第一个段,除非它恰好是我的顶级角度路径之一,在这种情况下创建根/

在web.config中,我将引用保留为/webapplicationname/。这在我们的商店是允许的,因为web.config无论如何都被认为是环境特定的。因此,允许从环境到环境变化,并且管理包含单独的设置。

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