1

我一直在为我正在从事的项目试验 Backbone,但我一直在让 Backbone 的“pushState”按我想要的方式运行时遇到问题。

我有一个由 4 个视图和一个路由器组成的简单项目。如果在这种情况下很重要,我将通过元素的 id 进行路由。当我转到其中一个视图的哈希(http://example.com/backbonetest/#step1 时,它显示正确,并且 url 已更改。这是我希望在这里发生的事情,但是当我尝试导航到没有哈希的同一事物时,问题就来了(http://example.com/backbonetest/step1 。我在服务器 (IIS) 上得到一个 404,这是意料之中的,因为该页面不存在。

我一整天都在尝试做的是为 IIS 编写一个正则表达式,它将捕获并重写 url,删除 url 末尾的片段,以便正确提供页面。我宁愿简单地重写 url 而不是拥有同名的物理文件,因为页面的内容将动态生成,并且无论如何都需要脚本来获取内容。

我遇到的问题可能与我需要如何在文件系统上构建文件夹/脚本/样式有关。我希望能够将整个示例包含在/backbonetest/文件夹中。对于脚本,'backbonetest/scripts' 等等。

我列出了我一直在测试我的正则表达式的 URL,以及我一直试图达到的结果:

    输入输出:

    2                       
    a2                      
    ab2                     
    ab22                    
    第2步                   
    脚本.js 脚本.js
    脚本/脚本/
    555/东西 555/东西
    脚本/script.js 脚本/script.js

编辑:我发现使用的 url 不包含前面的斜杠,这就是 Qtax 的解决方案在 IIS 中不起作用的原因。新的输入结构如上所示。

'/555/stuff' url 我希望 404 正常。如果没有定义除当前子目录之外的子目录,并且 url 没有引用显式文件(例如带有扩展名的文件),我只想重写 url。

我整天都在网上搜索这个问题的解决方案,并尝试使用正则表达式,但没有设法为我的问题找到合适的解决方案。在任何地方都没有找到任何东西之后,我想我一定是看错了……

谁能帮帮我?

4

2 回答 2

2

经过多次头部/桌面撞击后,我想出了解决方案。它引起的所有大惊小怪都非常简单:

^[^\./]+$

本质上:

如果 url 不包含 '/' 或 '.' 则替换 在它的任何地方。

现在,对于使用具有 Backbone 和 HTML5 推送状态的 IIS 的任何人来说,这应该是一个解决方案。只需将其弹出到应用程序根目录的 web.config 中,并将重写操作更改为“。”,它应该就可以工作了。

于 2012-04-12T14:53:08.143 回答
1

这让我整个早上的大脑都融化了!

我已经添加到这个 - 在我的场景中,我有一个位于 API 虚拟目录中的 API 项目(以消除对 CORS 的需要) - 我显然不想重写任何 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>
于 2013-09-11T10:32:26.340 回答