2012-04-11 63 views
1

我一直在爲我正在開發的一個項目嘗試使用Backbone,並且一直在爲獲得Backbone的'pushState'功能而發生問題。HTML5 PushState正則表達式問題

我有一個簡單的項目,包括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沒有引用顯式文件(例如帶有擴展名的文件)。

我一直在尋找解決這個問題的網絡,以及使用regexr進行實驗,但沒有設法提出適當的解決方案來解決我的問題。在沒有找到任何單一的東西后,我想我一定是看着這個錯誤的方式...

任何人都可以幫我嗎?

+0

不知道IIS,但正則表達式重寫你可以使用的是'^/[^。/ ] + $'到'/'。 – Qtax 2012-04-11 16:21:35

+0

這適用於我的測試數據以及IIS管理器中的測試人員,但由於某些原因,這些URL要麼未被正確捕獲,要麼已被重寫到錯誤的地方。 – brins0 2012-04-12 09:08:33

+0

我發現我在這裏給出的輸入並不是IIS用於重寫規則的東西,它解釋了爲什麼它不起作用。在Qtax建議的表達式中,爲了使它適用於新的輸入字符串,我需要改變什麼? – brins0 2012-04-12 13:00:09

回答

2

經過很多頭/桌子撞擊之後,我想出瞭解決方案。這對於它造成的一切大驚小怪不快簡單:

^[^\./]+$

本質:

更換,如果網址不包含「/」或「」它的任何地方。

這對於任何使用IIS和Backbone和HTML5推送狀態的人來說現在應該是一個解決方案。只需將它彈出到應用程序根目錄下的web.config中,然後將重寫操作更改爲「。」即可。

1

這讓我的大腦整個早上融化!

我已經添加到這裏 - 在我的場景中,我有一個API項目位於API虛擬目錄(以消除CORS的需要) - 我顯然不想重寫任何PAI調用,所以我重新寫我的如下 - 你可以做類似的API網址,如果需要...

 <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>