2

对于单页应用程序,我的 .htaccess 文件中有以下 RewriteRule 以将所有流量定向到 index.html,以便 JS 可以解析 URL 并相应地触发控制器。

  # html5 pushstate (history) support:
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !index
  RewriteRule (.*) index.html [L]

这适用于顶级 URL,如 www.mydomain.com/resource,但更深层次的 URL,如 www.mydomain.com/resource/123,会在 index.html 中破坏当前目录 ('.') 的值。

例如,我的 index.html 中的脚本标记如下

<script src="js/app/config.js"></script>

将转化为 src="resource/app/config.js"

或者,对于像“www.mydomain.com/more/nested/resource/123”这样的 url,同一个 js 文件上的 src 将被解释为“more/nested/resource/app/config.js”。

不用说,这些文件不存在并且应用程序中断。

任何人都可以对这里发生的事情有所了解吗?谢谢。

4

2 回答 2

7

我让它工作,这就是:

当您将以下内容作为 src 时:

<script src="js/app/config.js"></script>

您是对的,Apache 正确地重新路由到 index.html(或您拥有的任何后备 URL),然后尝试根据 URL 中的嵌套路径相对访问资源。

要更正此问题,您需要有一个前导“/”来表示根目录,如下所示:

<script src="/js/app/config.js"></script>

一旦我为我的 js 库、css 表等执行此操作,它就运行得非常好,backbone.js 处理了所有的 URL。

注意:在 Apache 2.2+ 中,您现在可以使用FallbackResource代替 mod_rewrite,它需要更少的行并完成相同的事情。

推荐的另一件事是尽可能使用绝对 URL。

于 2012-06-16T06:18:24.537 回答
2

我使用它来支持 html5 历史记录——js、css、img 或 svc 目录中的任何内容都未修改。其他所有内容都转到 index.html:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^(js|css|img|svc)($|/) - [L]
RewriteRule ^(.*)$ index.html [L]

请注意,我刚刚在下面看到您的评论。如果您将脚本引用为

<script src="/js/myscript.js"> 

那么您不必担心 html 的基本位置。注意“js”之前的斜线。我意识到在另一个答案中已经指出了这一点,但是该技术和重写规则的结合可能会奏效。

于 2013-04-17T22:25:42.240 回答