mod_rewrite到index.html打破了深层URL的相对路径

时间:2012-06-02 19:57:19

标签: javascript apache mod-rewrite single-page-application

对于单页应用,我在.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]

这适用于顶级网址,例如www.mydomain.com/resource,但更深层次的内容,例如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”这样的网址,同一个js文件中的src将被解释为“more / nested / resource / app / config.js”。< / p>

毋庸置疑,这些文件不存在且应用程序中断。

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

3 个答案:

答案 0 :(得分:5)

我得到了它的工作,这是如何:

当您将以下内容作为src:

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

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

要纠正这个问题,你需要有一个领先的&#34; /&#34;表示根目录,如下所示:

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

一旦我为我的js库,css表等做了这个,它工作得非常好,backbone.js处理了所有的URL。

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

建议的另一件事是尽可能使用绝对URL。

答案 1 :(得分: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”之前的斜杠。我意识到这是在另一个答案中指出的,但是该技术和重写规则的结合可能会成功。

答案 2 :(得分:-1)

我还希望所有网址都路由到我服务器上的同一个文件,然后找到this。那里提供的代码正是您所追求的。这是代码:

Options +FollowSymLinks
IndexIgnore */*
# Turn on the RewriteEngine
RewriteEngine On
#  Rules
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

这会将所有内容路由到index.php。只是为了您的目的将其更改为index.html,我认为这将有效。

顺便说一句,“www.mydomain.com/more/nested/resource/123”之类的内容将成功发送。