3

我有以下 URL 重写类似于

RewriteRule   ^event/([0-9]+)/$   page1.php?title=$1   [NC,L]

RewriteRule   ^view/([0-9]+)/$    page2.php?id=$1      [NC,L]

当我去domain.com/app/event/3/- 它去正确的 URL。

在此页面中,我有一个 JavaScript,它具有以下onclick事件

location.href = "view/5/";

在所有浏览器中,这翻译为domain.com/app/view/5/. 但在 IE(8 和 9)中,它最终成为domain.com/app/event/3/view/5/

它似乎只是附加到上一个 URL。

4

1 回答 1

1

IE 的行为似乎符合预期。您的相对路径href应该被解释为相对于当前路径,因为标记不知道服务器端的事物是如何构造的,除非您当然告诉它。

您在 Chrome 中遇到的问题也发生在我身上,这是应该的。如果您希望基于基本路径解析相对 url,您需要href从一开始就提供它,或者通过以下<base>标签提供它<head>

<!DOCTYPE html>
<html>
  <head>
    <base href="/app/" />
  </head>
  <body>
    <?php var_dump($_GET); ?>
    <ul>
      <li><a href="event/7">Foo</a></li>
      <li><a href="event/6">Bar</a></li>
    </ul>
  </body>
</html>

以上将按预期工作,因为我们已指示浏览器根据该部分href中的<base>元素解析任何相对路径<head>。如果你不这样做,浏览器应该解析href任何<a>相对于当前路径的相对。

请特别注意规范中有关相对 URL 的这一部分:

用户代理必须根据以下优先级(从最高优先级到最低优先级)计算基本 URI:

  1. 基本 URI 由 BASE 元素设置。
  2. 基本 URI 由在协议交互期间发现的元数据给出,例如 HTTP 标头(参见 [RFC2616])。
  3. 默认情况下,基本 URI 是当前文档的 URI。并非所有的 HTML 文档都有一个基本的 URI(例如,一个有效的 HTML 文档可能出现在电子邮件中,并且可能不是由 URI 指定的)。如果此类 HTML 文档包含相对 URI 并依赖于默认的基本 URI,则认为它们是错误的。(重点补充)

同样,如果您希望看到相对href值解析为您的基本 url,您需要在链接本身或通过<base>元素提供该基础,如我在上面的示例中所做的那样。

需要考虑的其他事项:

我想回到这个问题并记录一些其他可能相关的事情。href访问锚属性的各种方法会返回不同的结果。

考虑以下:

var anchor = document.createElement("a");
    anchor.setAttribute("href", "foo.php?fizz=buzz");

console.log( "href:         " + anchor.href );
console.log( "getAttribute: " + anchor.getAttribute("href") );

以下是我们看到的各种 Internet Explorer 版本的输出:

互联网浏览器 6 - 7

href:         foo.php?fizz=buzz
getAttribute: foo.php?fizz=buzz

互联网浏览器 8 - 10

href:         http://fiddle.jshell.net/_display/foo.php?fizz=buzz
getAttribute: foo.php?fizz=buzz

从 Internet Explorer 8 开始,该.href属性会根据当前文档位置自动解析完整的 URI,并将锚点的href值附加到末尾。这与我们在其他现代浏览器中看到的行为相同。

因此,如果您需要获取href值,明智的做法是使用.getAttribute("href")而不是访问.href属性。

于 2012-12-09T02:47:55.927 回答