2016-10-26 7 views
0

TypescriptでAngular 2アプリを使用しています。サーバはlighweight NancyFX(C#)であり、未知のapi呼び出しが行われた場合に "/"へのリダイレクトで応答するように設定されています。角2:新しいタブで開き、リクエストを保存するURL

私たちは何をしようとしていますか: アプリケーションが開始され、ユーザーがログインしています。今度は、「新しいタブでリンクを開く」またはCTRL +クリックを使用して2番目のタブを開きます。

アプリは、新しい種類のルートURL(例:「/ order/5」)で再び新しいタブで開きます。サーバーは "/"(基本角度ルート)へのリダイレクトで応答し、アプリケーションは起動し、すべての角度のものを読み込み、ベースルートにリダイレクトされ、ユーザーにトークンが利用可能かどうかをチェックします。元のリクエストURL

問題:サーバーが「/」にリダイレクトするため、元のURLリクエスト(「/ order/5」)はなくなりました。

リダイレクトする場所をクライアントが知るようにURLを保存する方法はありますか(localstorageなど)

私は私が見る唯一の方法は、サーバーコードでURLを保存することであるが、これは各ブラウザのために行う必要があります。..キー/イベントをクリックしますが、これはすべての少しハックですが読んについて

を何かを読みますセッションを個別にまたはいくつかの種類のwindow.historyと比較しますが、これが新しいセッションか単なるページリフレッシュかどうかをどのように知るべきですか?

デフォルトのPathLocationStrategyを使用します。

誰かがアイデアを持っているのですか、それとも不可能ですか?

UPDATE: マイナンシーホスティングモジュール

public HostingModule() 
    { 
     Get["/"] = o => Response.AsFile(Path.Combine(Response.RootPath, "index.html")); 
     Get["/{ignored*}", ctx => ctx.Request.Headers.Accept.Any(x => x.Item1 == "text/html")] = o => 
      { 
       return Response.AsFile(Path.Combine(Response.RootPath, "index.html")); 

      }; 
    } 

だから、text/htmlのヘッダーを持つすべての要求が受け入れられ、デフォルトのindex.html.Thisを返すべきであるが

を動作しますが:問題は、すべてのことですindex.html内のファイルは、起点パスに関連して要求されます:

最初のリクエスト: "foo.com/order/5" - > response index.html - >その後、クライアントはindex.html ->にあるすべてのスクリプトの読み込みを開始しますが、リクエストはfoo.com/ですすべてのスクリプトは次のようにロードしようとしています: foo.com/script1.jsの代わりにfoo.com/order/script1.js

- >私は404エラーの混乱しか受けません。それは何度も何度もindex.htmlをするためにクライアントをリダイレクトする404エラーのために私のリダイレクトStatusCodehandler ...助けを

しかし感謝を保つ

+0

"/"にリダイレクトしない –

+0

これは、アプリケーションがロードされる前にルートがナンシーで明示的に定義されていない場合、404エラーに終わるだけです。 –

答えて

0

角度アプリを含むindex.htmlを表示するようにリダイレクトしています。私はこれを解決する方法は2つのルートインデックスの経路を使用することである、と

(任意のブラウザ要求であるべきである) text/htmlの値を持つヘッダを受け入れる最初のルートを探し貪欲経路がある:

Get("/", ...); 

これはインデックスのリンク先ページです。だから、HTMLを探していない、それはデフォルトのページを返します。すべての要求を

https://github.com/NancyFx/Nancy/wiki/Defining-routes#pattern

Get("/{ignored*}", ..., ctx => ctx.Request.Headers.Accept.Any(x => x.Item1 == "text/html")); 

第2の経路は、貪欲なルートを使用しています。 application/jsonを受け入れようとしている角度からのものは、他のすべてのクエリに応答します。

+0

ええと...多分私は正しいかもしれませんが、 角度経路は "order.html"ではなく "order/5"以上です - >これは通常内部ルータによって処理されます。しかし、新しいタブを起動して「shop.com/order/5」 - >サーバーのようなURLを入力するとすぐに、角型アプリケーション(およびそのルーター)がまだ開始されていないため、/サーバーがリクエストを受け取ります。 - >サーバーがHTMLリクエストかどうかをチェックする - > NO - > apiの呼び出しを確認する - > NO - >デフォルトのindex.htmlを返し、クライアントが角度アプリを起動します。しかし、起源 "注文/ 5"の要求はなくなっています... –

+0

あなたの角型アプリは、リンク先ページを正しく持っていますか?これは '/'にリダイレクトされる理由で、私が書いたのはルートルートで、キャッチオール(アプリケーション/ jsonでない場合)のルートです。キャッチの目的は '/'へのリダイレクトを防ぎ、 '/' – Phill

+0

と同じデフォルトのランディングページを返す '/ order/5'のリクエストは' application/json'を受け入れず、あなたが使用する 'index.html'ページを返します'/'のためにあなたの角型アプリケーションが起動し、 'application/json'を受け入れるルートから'/order/5'を要求します。 – Phill

関連する問題