mod_rewrite到index.html会断开深层URL的相对路径

Tho*_*mas 1 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]
Run Code Online (Sandbox Code Playgroud)

这对于顶级网址(如www.mydomain.com/resource)正常工作,但对于更深层次的诸如www.mydomain.com/resource/123之类的URL,则在index.html中时会中断当前目录的值(。)。

例如,像这样在我的index.html中的脚本标记

<script src="js/app/config.js"></script>
Run Code Online (Sandbox Code Playgroud)

会翻译成src =“ resource / app / config.js”

或者,对于类似“ www.mydomain.com/more/nested/resource/123”的网址,同一js文件上的src将被解释为“ more / nested / resource / app / config.js”。

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

任何人都可以了解这里发生的一切吗?谢谢。

Ala*_*and 5

我知道了,这是这样的:

当您提供以下内容作为src时:

<script src="js/app/config.js"></script>
Run Code Online (Sandbox Code Playgroud)

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

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

<script src="/js/app/config.js"></script>
Run Code Online (Sandbox Code Playgroud)

一旦对我的js库,css表格等执行了此操作,它就可以很好地工作,并且ribs.js可以处理所有URL。

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

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