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 に移動します。

onclickこのページには、次のイベントを持つ JavaScript があります。

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 は現在のドキュメントのものです。すべての HTML ドキュメントにベース URI があるわけではありません (たとえば、有効な HTML ドキュメントが電子メールに表示され、URI で指定されていない場合があります)。そのような HTML ドキュメントが相対 URI を含み、デフォルトのベース URI に依存している場合、その HTML ドキュメントはエラーと見なされます。(強調追加)

繰り返しますが、相対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 のさまざまなバージョンで表示される出力を次に示します。

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

于 2012-12-09T02:47:55.927 に答える