【问题标题】:mod_rewrite to index.html breaks relative paths for deep URLsmod_rewrite 到 index.html 会破坏深层 URL 的相对路径
【发布时间】:2013-09-16 05:48:55
【问题描述】:

对于单页应用程序,我的 .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,会在索引中破坏当前目录 ('.') 的值。 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”。

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

任何人都可以解释这里发生了什么吗?谢谢。

【问题讨论】:

  • 我没有完全理解,但您似乎可以像这样使用 html 基本标签: 使用 IE 的完整主机名兼容性(http 中的点用于破坏 url 以显示真实文本)
  • 这个问题是我需要相对 url 才能在我的 .html 文件中工作,因为这个站点在多个本地、阶段、测试和生产域之间不断移动。

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


【解决方案1】:

我让它工作了,这是怎么回事:

当您将以下内容作为 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。

【讨论】:

  • 嘿,谢谢!这帮助了我。不过我确实遇到了麻烦,因为我使用的是抽象视图,当我在其中一个子视图上点击刷新时,它只会加载即时视图而不是抽象版本,这意味着我丢失了所有导航项。知道如何解决这个问题吗?
  • 前导斜杠“/”适用于 html,但如果您有 PHP 包含或需要,请小心。根是不同的,因此您需要在路径中指定正确的根。例如像这样:包括 $_SERVER['DOCUMENT_ROOT']."/path/to/the/resource.php";
【解决方案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”之前的斜线。我意识到在另一个答案中已经指出了这一点,但是这种技术和重写规则的结合可能会奏效。

【讨论】:

  • 我又想到了这个问题。听起来您是在说您的不同环境使用域下面的不同路径。例如。 production.com/index.html 等同于 development.com/mySite/index.html 或类似的东西。如果是这种情况,那么听起来您所要求的并不是如何重写 html 页面的 URL(正如到目前为止的答案所做的那样),而是重写 *.js 文件的 URL .在这种情况下,您可能想告诉我们 js 文件在您的各种环境中的位置,看看我们是否可以为您找出一些规则。
猜你喜欢
  • 2013-08-19
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
相关资源
最近更新 更多