147

私はAngularJSシードプロジェクトを持っていて、追加しました

$locationProvider.html5Mode(true).hashPrefix('!');

app.js ファイルに。IIS 7 を構成して、すべての要求を次の場所にルーティングしたい

http://localhost/app/index.html

これが私のために働くように。どうすればいいですか?

アップデート:

IIS URL Rewrite モジュールを発見、ダウンロード、インストールしたところです。これにより、目標を簡単かつ明確に達成できることを願っています。

更新 2 :

これは私が達成しようとしていることを要約していると思います(AngularJS Developer documentationから取得):

このモードを使用するには、サーバー側で URL を書き換える必要があります。基本的に、アプリケーションのエントリ ポイント (index.html など) へのすべてのリンクを書き換える必要があります。

更新 3:

私はまだこれに取り組んでおり、次のような特定の URL をリダイレクトしない (書き換えるルールがある) 必要があることに気付きました。

http://localhost/app/lib/angular/angular.js
http://localhost/app/partials/partial1.html

そのため、css、js、lib、または partials ディレクトリにあるものはすべてリダイレクトされません。それ以外はすべて app/index.html にリダイレクトする必要があります

すべてのファイルにルールを追加することなく、これを簡単に達成する方法を知っている人はいますか?

更新 4:

IIS URL 書き換えモジュールで定義された 2 つの受信規則があります。最初のルールは次のとおりです。

IIS URL 書き換え受信規則 1

2 番目のルールは次のとおりです。

IIS URL 書き換え受信規則 2

localhost/app/view1 に移動すると、ページが読み込まれますが、サポート ファイル (css、js、lib、および partials ディレクトリにあるファイル) も app/index.html ページに書き直されています。どの URL を使用しても index.html ページに戻ります。これは、これらの URL が 2 番目のルールによって処理されるのを防ぐはずの最初のルールが機能していないことを意味していると思います。何かアイデアはありますか? ...誰でも?...私は孤独を感じる... :-(

4

8 に答える 8

303

$locationProvider.html5Mode(true)に設定した後、web.config にルールを書き出しapp.jsます。

希望、誰かを助けます。

  <system.webServer>
    <rewrite>
      <rules>
        <rule name="AngularJS Routes" stopProcessing="true">
          <match url=".*" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
            <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />
          </conditions>
          <action type="Rewrite" url="/" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>

私のindex.htmlにこれを追加しました<head>

<base href="/">

IIS URL Rewriteをサーバーにインストールすることを忘れないでください。

また、Web API と IIS を使用している場合、API がwww.yourdomain.com/api3 番目の入力 (条件の 3 行目) のために にある場合、これは機能します。

于 2014-10-01T22:57:40.467 に答える
40

質問に示されている IIS インバウンド ルールは機能します。ブラウザーのキャッシュをクリアし<head>、index.html ページのセクションの上部に次の行を追加する必要がありました。

<base href="/myApplication/app/" />

これは、localhost に複数のアプリケーションがあり、他のパーシャルへのリクエストがlocalhost/app/view1代わりに取得されたためです。localhost/myApplication/app/view1

うまくいけば、これは誰かを助けます!

于 2012-10-25T00:09:47.990 に答える
13

次の 2 つの条件しかない場合の問題:

  <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
  <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />

{REQUEST_FILENAME} がディスク上に物理的に存在している間だけ機能するということです。これは、誤って名前が付けられた部分ビューのリクエストが 404 の代わりにルート ページを返すシナリオが存在する可能性があることを意味します。

したがって、これらのトラブルシューティングが困難な問題を回避するために、いくつかの安全な「フォールバック」ルールをお勧めします。

  <add input="{REQUEST_FILENAME}" pattern="(.*?)\.html$" negate="true" />
  <add input="{REQUEST_FILENAME}" pattern="(.*?)\.js$" negate="true" />
  <add input="{REQUEST_FILENAME}" pattern="(.*?)\.css$" negate="true" />

または任意のファイル末尾に一致する条件:

<conditions>
  <!-- ... -->
  <add input="{REQUEST_FILENAME}" pattern=".*\.[\d\w]+$" negate="true" />
</conditions>
于 2015-11-25T20:13:33.940 に答える
11

私の場合、正しい書き換えルールを設定した後も 403.14 を取得し続けました。URL ルートの 1 つと同じ名前のディレクトリがあったことがわかりました。IsDirectory 書き換えルールを削除すると、ルートが正しく機能するようになりました。ディレクトリの否定を削除すると問題が発生する場合がありますか? 私の場合は考えられません。私が考えることができる唯一のケースは、アプリでディレクトリを参照できる場合です。

<rule name="fixhtml5mode" stopProcessing="true">
  <match url=".*"/>
  <conditions logicalGrouping="MatchAll">
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
  </conditions>
  <action type="Rewrite" url="/" />
</rule>
于 2014-07-23T21:51:45.270 に答える
1

私が見つけた最も簡単な方法は、404 をトリガーする要求をクライアントにリダイレクトすることです。これは、 が設定されている場合でもハッシュタグを追加することによって行われ$locationProvider.html5Mode(true)ます。

このトリックは、同じ Web サイト上に複数の Web アプリケーションがあり、URL の整合性の制約 (外部認証など) が必要な環境で有効です。ここにステップバイステップの方法があります

index.html

<base>要素を適切に設定する

<base href="@(Request.ApplicationPath + "/")">

web.config

最初に 404 をカスタム ページ (「Home/Error」など) にリダイレクトします。

<system.web>
    <customErrors mode="On">
        <error statusCode="404" redirect="~/Home/Error" />
    </customErrors>
</system.web>

ホームコントローラー

ActionResultクライアント側のルートで入力を「変換」する単純なものを実装します。

public ActionResult Error(string aspxerrorpath) {
    return this.Redirect("~/#/" + aspxerrorpath);
}

これが最も簡単な方法です。


URL が有効な場合にのみ 404 をクライアントにリダイレクトし、クライアントで何も見つからない場合に 404 を通常どおりにトリガーするように、いくつかの改善されたロジックでエラー関数を拡張することができます (推奨されますか?)。これらの角度のあるルートがあるとしましょう

.when("/", {
    templateUrl: "Base/Home",
    controller: "controllerHome"
})
.when("/New", {
    templateUrl: "Base/New",
    controller: "controllerNew"
})
.when("/Show/:title", {
    templateUrl: "Base/Show",
    controller: "controllerShow"
})

URL が「/New」または「/Show/」で始まる場合にのみ、URL をクライアントにリダイレクトすることは理にかなっています。

public ActionResult Error(string aspxerrorpath) {
    // get clientside route path
    string clientPath = aspxerrorpath.Substring(Request.ApplicationPath.Length);

    // create a set of valid clientside path
    string[] validPaths = { "/New", "/Show/" };

    // check if clientPath is valid and redirect properly
    foreach (string validPath in validPaths) {
        if (clientPath.StartsWith(validPath)) {
            return this.Redirect("~/#/" + clientPath);
        }
    }

    return new HttpNotFoundResult();
}

これは改善されたロジックの例にすぎません。もちろん、すべての Web アプリケーションにはさまざまなニーズがあります。

于 2016-06-30T12:34:20.283 に答える