[インデックス 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.html
が http://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/"
これは外部サイトへのリンクや、特定のドメインに依存するリソースへのリンクに使用されます。
- 例:
- ルート相対パス (Root-Relative Path): ウェブサイトのドキュメントルート(サーバーの公開ディレクトリの最上位)を基準にしてパスを指定する方法です。パスは
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.html
が http://example.com/doc/contrib.html
として提供されていた場合、これらのリンクはそれぞれ http://example.com/doc/devel/roadmap.html
、http://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.html
が http://example.com/project/contrib.html
として提供されても、ブラウザは /doc/devel/roadmap.html
を http://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の相対パスと絶対パスに関する情報源)
* (一般的なウェブサーバーのルーティングに関する情報源)