Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 12065] ファイルの概要

このコミットは、Goプロジェクトのドキュメントファイル doc/contrib.html 内のローカルリンクを修正するものです。contrib.html/project/ というパスで提供されるようになったため、相対パスで記述されていたリンクが正しく機能しなくなっていました。このコミットでは、これらの相対リンクを /doc/ をプレフィックスとする絶対パスに修正することで、リンク切れを解消しています。

コミット

commit d5b28ad2b6da460ef10f9b94bb067053fb1a2e13
Author: Bobby Powers <bobbypowers@gmail.com>
Date:   Mon Feb 20 08:33:28 2012 +1100

    doc: update contrib.html
    
    Fix all the local links, as contrib.html is served as
    /project/
    
    R=golang-dev, adg
    CC=golang-dev
    https://golang.org/cl/5656105

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/d5b28ad2b6da460ef10f9b94bb067053fb1a2e13

元コミット内容

doc: update contrib.html

contrib.html/project/ として提供されるため、すべてのローカルリンクを修正します。

変更の背景

この変更の背景には、ウェブサーバーがHTMLファイルをどのように提供するかという基本的な仕組みと、Goプロジェクトのドキュメント構造の変更が関係しています。

通常、ウェブサーバーは特定のディレクトリをルートとしてファイルを公開します。例えば、doc/contrib.html というファイルがサーバーのルートディレクトリ直下にある場合、http://example.com/contrib.html のようにアクセスできます。この場合、href="devel/roadmap.html" のような相対リンクは、http://example.com/devel/roadmap.html を指します。

しかし、このコミットメッセージによると、contrib.html/project/ というパスで提供されるようになったとあります。これは、ウェブサーバーの設定が変更され、doc/contrib.htmlhttp://example.com/project/contrib.html のようなURLでアクセスされるようになったことを意味します。

この変更により、contrib.html 内に記述されていた href="devel/roadmap.html" のような相対リンクは、http://example.com/project/devel/roadmap.html を指すことになります。しかし、実際の devel/roadmap.html はおそらく http://example.com/doc/devel/roadmap.html のようなパスに存在するため、リンクが機能しなくなってしまいます。

この問題を解決するため、リンクのパスを相対パスから絶対パス(ルートからのパス)に変更する必要がありました。具体的には、/doc/ をプレフィックスとして追加することで、http://example.com/doc/devel/roadmap.html のように、サーバーのルートからの正しいパスを指すように修正されています。

前提知識の解説

1. HTMLにおける相対パスと絶対パス

ウェブページ内のリンク(<a> タグの href 属性など)や画像(<img> タグの src 属性など)のURL指定には、主に「相対パス」と「絶対パス」の2種類があります。

  • 相対パス (Relative Path): 現在のファイルの位置を基準にして、目的のファイルへのパスを指定する方法です。

    • 例: href="image.png" (現在のディレクトリにある image.png)
    • 例: href="../css/style.css" (一つ上のディレクトリにある css フォルダ内の style.css)
    • 例: href="subfolder/page.html" (現在のディレクトリの subfolder 内にある page.html) 相対パスは、ファイル構造が固定されている場合に便利ですが、ファイルの場所が移動したり、ウェブサーバー上での提供パスが変わったりすると、リンクが壊れる可能性があります。
  • 絶対パス (Absolute Path):

    • ルート相対パス (Root-Relative Path): ウェブサイトのドキュメントルート(サーバーの公開ディレクトリの最上位)を基準にしてパスを指定する方法です。パスは / で始まります。
      • 例: href="/images/logo.png" (ドキュメントルートの images フォルダにある logo.png)
      • 例: href="/doc/devel/roadmap.html" (ドキュメントルートの doc/devel フォルダにある roadmap.html) このコミットで採用されているのはこの形式です。ウェブサーバーがファイルをどこから提供していても、ドキュメントルートからのパスが正しければリンクは機能します。
    • 完全なURL (Full URL): プロトコル(http://https://)から始まる、インターネット上のリソースを一意に特定するパスです。
      • 例: href="https://www.google.com/" これは外部サイトへのリンクや、特定のドメインに依存するリソースへのリンクに使用されます。

2. ウェブサーバーのルーティングとURLパス

ウェブサーバー(Apache, Nginx, Goのnet/httpなど)は、受信したHTTPリクエストのURLパスに基づいて、どのファイルやリソースを返すかを決定します。このプロセスを「ルーティング」と呼びます。

例えば、サーバーが /var/www/html をドキュメントルートとして設定している場合:

  • http://example.com/index.html へのリクエストは /var/www/html/index.html を返します。
  • http://example.com/doc/contrib.html へのリクエストは /var/www/html/doc/contrib.html を返します。

しかし、サーバーの設定によっては、特定のパスを別の物理パスにマッピングしたり、リクエストを書き換えたりすることができます。このコミットのケースでは、doc/contrib.html という物理ファイルが、ウェブサーバー上では /project/contrib.html というURLパスで提供されるように設定が変更されたと考えられます。

このようなサーバー側のルーティング変更があった場合、HTMLファイル内の相対パスは、そのHTMLファイルが「どのURLパスで提供されているか」を基準に解決されるため、意図しないパスを指してしまうことになります。これを避けるためには、ドキュメントルートからの絶対パス(ルート相対パス)を使用するのが最も堅牢な方法です。

技術的詳細

このコミットの技術的な核心は、ウェブコンテンツのパス解決における「ベースURL」の概念と、それに対するルート相対パスの適用です。

HTMLドキュメント内の相対URLは、そのドキュメントがブラウザによってロードされた際の「ベースURL」に基づいて解決されます。ベースURLは通常、ドキュメント自体のURLです。

元の doc/contrib.html ファイルには、以下のような相対リンクがありました。

<a href="devel/roadmap.html">Roadmap</a>
<a href="devel/release.html">Release History</a>
<a href="devel/weekly.html">Weekly Snapshot History</a>
<a href="contribute.html">Contributing code</a>

もし doc/contrib.htmlhttp://example.com/doc/contrib.html として提供されていた場合、これらのリンクはそれぞれ http://example.com/doc/devel/roadmap.htmlhttp://example.com/doc/contribute.html などに解決され、正しく機能していました。

しかし、コミットメッセージにあるように、contrib.html/project/ というパスで提供されるようになった、つまり http://example.com/project/contrib.html としてアクセスされるようになった場合、ベースURLは http://example.com/project/contrib.html となります。

この新しいベースURLを基準にすると、元の相対リンクは以下のように解決されてしまいます。

  • href="devel/roadmap.html"http://example.com/project/devel/roadmap.html
  • href="contribute.html"http://example.com/project/contribute.html

しかし、Goのドキュメント構造では、これらのファイルは実際には /doc/ の下に存在します(例: /doc/devel/roadmap.html)。そのため、/project/ の下に解決されたリンクは「リンク切れ」となります。

この問題を解決するために、コミットではすべてのローカルリンクを「ルート相対パス」に変換しています。具体的には、href 属性の値に /doc/ をプレフィックスとして追加しています。

<a href="/doc/devel/roadmap.html">Roadmap</a>
<a href="/doc/devel/release.html">Release History</a>
<a href="/doc/devel/weekly.html">Weekly Snapshot History</a>
<a href="/doc/contribute.html">Contributing code</a>

このように変更することで、contrib.htmlhttp://example.com/project/contrib.html として提供されても、ブラウザは /doc/devel/roadmap.htmlhttp://example.com/doc/devel/roadmap.html として解決します。これは、パスがサーバーのドキュメントルート(http://example.com/)を基準にしているため、contrib.html がどのサブパスで提供されても影響を受けません。

この修正は、ウェブアプリケーションのデプロイメント環境やURL構造が変更された際に、内部リンクの堅牢性を保つための一般的なプラクティスを示しています。

コアとなるコードの変更箇所

--- a/doc/contrib.html
+++ b/doc/contrib.html
@@ -12,13 +12,13 @@
 <p>View the status of Go builds across the supported operating
 systems and architectures.</p>
 
-<h3 id=\"roadmap\"><a href=\"devel/roadmap.html\">Roadmap</a></h3>
+<h3 id=\"roadmap\"><a href=\"/doc/devel/roadmap.html\">Roadmap</a></h3>
 <p>Features and ideas being developed or discussed by the Go team.</p>
 
-<h3 id=\"release\"><a href=\"devel/release.html\">Release History</a></h3>
+<h3 id=\"release\"><a href=\"/doc/devel/release.html\">Release History</a></h3>
 <p>A summary of the changes between Go releases.</p>
 
-<h3 id=\"release\"><a href=\"devel/weekly.html\">Weekly Snapshot History</a></h3>
+<h3 id=\"release\"><a href=\"/doc/devel/weekly.html\">Weekly Snapshot History</a></h3>
 <p>A summary of the changes between weekly snapshots of Go.</p>
 
 <h3 id=\"golang-dev\"><a href=\"http://groups.google.com/group/golang-dev\">Developer Mailing List</a></h3>
@@ -47,13 +47,13 @@ a new one.)
 We pride ourselves on being meticulous; no issue is too small.\n </p>\n \n-<h3><a href=\"contribute.html\">Contributing code</a></h3>\n+<h3><a href=\"/doc/contribute.html\">Contributing code</a></h3>\n \n <p>\n Go is an open source project and we welcome contributions from the community.\n </p>\n <p>\n-To get started, read these <a href=\"contribute.html\">contribution\n+To get started, read these <a href=\"/doc/contribute.html\">contribution\n guidelines</a> for information on design, testing, and our code review process.\n </p>\n <p>\n```

## コアとなるコードの解説

このコミットでは、`doc/contrib.html` ファイル内の6つの `<a>` タグの `href` 属性が変更されています。

具体的には、以下の相対パスが、それぞれ対応するルート相対パスに修正されています。

1.  `- <a href="devel/roadmap.html">`
    `+ <a href="/doc/devel/roadmap.html">`
    *   `devel/roadmap.html` は、現在のファイル(`contrib.html`)と同じディレクトリにある `devel` サブディレクトリ内の `roadmap.html` を指していました。
    *   `/doc/devel/roadmap.html` は、ウェブサイトのドキュメントルート(例: `http://example.com/`)から見た `/doc/devel/roadmap.html` を指すようになります。

2.  `- <a href="devel/release.html">`
    `+ <a href="/doc/devel/release.html">`
    *   上記と同様に、`devel` サブディレクトリ内の `release.html` への相対パスが、ルート相対パスに修正されています。

3.  `- <a href="devel/weekly.html">`
    `+ <a href="/doc/devel/weekly.html">`
    *   上記と同様に、`devel` サブディレクトリ内の `weekly.html` への相対パスが、ルート相対パスに修正されています。

4.  `- <h3><a href="contribute.html">`
    `+ <h3><a href="/doc/contribute.html">`
    *   `contribute.html` は、現在のファイル(`contrib.html`)と同じディレクトリにある `contribute.html` を指していました。
    *   `/doc/contribute.html` は、ドキュメントルートから見た `/doc/contribute.html` を指すようになります。

5.  `- To get started, read these <a href="contribute.html">contribution`
    `+ To get started, read these <a href="/doc/contribute.html">contribution`
    *   上記と同様に、`contribute.html` への相対パスが、ルート相対パスに修正されています。

これらの変更はすべて、`contrib.html` が `/project/` という異なるベースURLで提供されるようになったことによるリンク切れを防ぐためのものです。ルート相対パスを使用することで、`contrib.html` がどのURLパスで提供されても、リンクは常にウェブサイトのドキュメントルートを基準に解決されるため、安定したナビゲーションが保証されます。

## 関連リンク

*   Go Code Review 5656105: [https://golang.org/cl/5656105](https://golang.org/cl/5656105)

## 参考にした情報源リンク

*   GitHubコミットページ: [https://github.com/golang/go/commit/d5b28ad2b6da460ef10f9b94bb067053fb1a2e13](https://github.com/golang/go/commit/d5b28ad2b6da460ef10f9b94bb067053fb1a2e13)
*   (一般的なHTMLの相対パスと絶対パスに関する情報源)
*   (一般的なウェブサーバーのルーティングに関する情報源)