对于单页应用,我在.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>
毋庸置疑,这些文件不存在且应用程序中断。
任何人都可以了解这里发生的事情吗?感谢。
答案 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”之类的内容将成功发送。