HTML5 PushState正则表达式问题

问题描述:

我一直在为我正在开发的一个项目尝试使用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

经过很多头/桌子撞击之后,我想出了解决方案。这对于它造成的一切大惊小怪不快简单:

^[^\./]+$

本质:

更换,如果网址不包含“/”或“”它的任何地方。

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

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

我已经添加到这里 - 在我的场景中,我有一个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>