2012-04-11 10 views
1

私が取り組んでいるプロジェクトでBackboneを試してきました。バックボーンの「pushState」をどうやって機能させるのかに問題がありました。HTML5 PushState Regex Issue

私は4つのビューとルータからなるシンプルなプロジェクトを持っています。この場合、要素のIDを介してルーティングしています。ビュー(http://example.com/backbonetest/ #step1)のいずれかのハッシュに行くと、正しく表示され、URLが変更されます。これは私がここで起こると予想されるものですが、問題は、ハッシュなしで同じものに移動しようとすると発生します(http://example.com/backbonetest/ step1)。ページが存在しないので、予想されるサーバー(IIS)上に404が表示されます。

私が一日中やろうとしてきたのは、IISの正規表現を書いてURLを捕まえて書き換え、URLの最後にあるフラグメントを削除してページが正しく提供されるようにすることです。私は、ページのコンテンツが動的に生成され、とにかくコンテンツを取得するためのスクリプトが必要になるため、同じ名前の物理ファイルを持つよりもむしろURLを書き直すだけです。

私が遭遇した問題は、ファイルシステム上にフォルダ/スクリプト/スタイルをどのように構築する必要があるかと関係している可能性があります。私は/backbonetest/フォルダに含まれている全体の例を持つことができるようにしたいと考えていました。スクリプトの場合は、 'backbonetest/scripts'などです。

私は反対私の正規表現式をテストしてきたURLのリストを作った、と私は達成しようとしてきた結果:私は以来、ことを発見しました:

 
    Input:     Output: 

    2      
    a2      
    ab2      
    ab22      
    step2     
    script.js    script.js 
    scripts/    scripts/ 
    555/stuff    555/stuff 
    scripts/script.js  scripts/script.js 

編集URLに先行するスラッシュ( )が含まれていないため、QtaxのソリューションはIISで動作しません。新しい入力構造が上に示されています。

'/ 555/stuff' url私は404として通常通りと思っています。現在のURL以外のサブディレクトリが定義されていない場合や、URLが明示的なファイル(例えば、拡張子を持つファイル)を参照していない場合にのみ、URLを書き換えたいとします。

私は一日中、これに対する解決策と正規表現を試してみましたが、私の問題の適切な解決策を思いついていませんでした。私はどこでも一つのことを見つけなかったので、私はこれを間違った方法で見ていなければならないと思っています...

誰かが私を助けてくれますか?

+0

は、IISのことは知らないが、正規表現を書き換える^ ^/[ 'です/。 ] + $ 'を'/'に設定します。 – Qtax

+0

これは私のテストデータとIISマネージャーのテスターで完璧に動作しますが、なんらかの理由でURLが正しく捕捉されないか、間違った場所に書き換えられてしまいます。 – brins0

+0

ここで私が入力したのは、IISが書き換えルールに使用するものではなく、なぜ動作していないのかを説明したものです。新しい入力文字列のためにQtaxが提案する式を変更する必要がありますか? – brins0

答えて

2

私は多くのヘッド/デスクを叩いた後、解決策を考え出しました。それは、それが原因だ大騒ぎためイライラシンプルです:

基本的に
^[^\./]+$

URLが「/」またはAが含まれていない場合は交換してください「」どこにでもあります。

これは、BackboneとHTML5のプッシュ状態でIISを使用しているすべてのユーザーに適したソリューションです。あなたのアプリのルートにあるweb.configにポップアップして、書き換えアクションを "。"に変更すれば、うまくいくはずです。

1

これは私の頭脳を徹底的に解消しました!

私はこれに追加しました - 私のシナリオでは、私はAPI仮想ディレクトリ(CORSの必要性を排除するために)に座っているAPIプロジェクトを持っています - 私は明らかにPAI呼び出し、だから再書いた鉱山次のように - 必要であれば、あなたのAPIのURLについても同様に行うことができます...あなたが使用することができ

 <rule name="Handle PushState"> 
     <match url="^[^\./]+[^\./api]+(.*)$" /> 
     <conditions> 
      <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
      <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
     </conditions> 
     <action type="Rewrite" url="." /> 
     </rule>