IE的URL重写问题 - 导致它追加

时间:2012-12-07 19:43:01

标签: internet-explorer url rewrite

我有以下网址重写类似于

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/时,它会转到正确的网址。

在此页面中,我有一个JavaScript,其中包含以下onclick事件

location.href = "view/5/";

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

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

1 个答案:

答案 0 :(得分:1)

IE似乎表现得像预期的那样。 href中的相对路径应该被解释为相对于当前路径,因为标记不知道服务器端的结构如何,除非你告诉它。

问题你在Chrome中也遇到过这样的问题。如果您希望根据基本路径解析相对网址,则需要从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>

特别注意有关relative-urls的规范的this portion

  

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

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

再次,如果您希望看到相对href值解析为您的基本网址,您需要在链接本身或通过<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看到的输出:

Internet Explorer 6 - 7

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

Internet Explorer 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属性是明智的。