HTML

The HTML <link> element doesn’t display content; it tells browsers and search engines how this page is related to external resources like CSS, icons, canonical URLs, alternate languages, manifests, and performance hints such as preload or preconnect.

link要素

link は、ページ本文の中に文章や画像を「表示」するためのタグではありません。「このページは、外部の何と関係があるのか」を宣言するためのタグです。たとえば「このCSSを使う」「このアイコンがこのサイトの印」「このページの正規URLはこれ」「別言語版はここ」「先にこれを取りに行って」など、ブラウザや検索エンジンに“関連付けの札”を渡すイメージです。

いちばん大事なのは rel(relationship)です。rel に何を書くかで、<link> の役割がガラッと変わります。

まずはここだけ:<link> の主役は rel

「何とどういう関係か」を伝えるタグ
<link> はページと外部リソースの関係を宣言します。見た目は何も変わらなくても、読み込み・検索・共有・速度など“裏側の動き”が変わります。
rel が意味(目的)を決める
rel="stylesheet" ならCSS、rel="icon" ならアイコン、rel="canonical" なら正規URL…のように、rel がスイッチになります。
href は「どこ?」、as は「何の種類?」
多くのケースで href は対象のURLです。速度最適化(preload 等)では as(script/style/fontなど)も重要になります。

覚え方:rel = 目的href = 場所(必要なら)as = 種類

基本形(CSSを読み込む)

まずは、これが書ければOKです。

HTML

<link rel="stylesheet" href="/assets/site.css">
rel="stylesheet"
「これはCSSです。このページの見た目に使ってね」という意味です。
href="/assets/site.css"
CSSファイルの場所(URL)です。パスが間違うと当然当たりません。

どこに置く?(迷ったら <head>

<link> は基本的に <head> の中に置きます。理由はシンプルで、CSSやアイコン、正規URL、先読みヒントは「ページ本体を描く前に知っておいてほしい情報」だからです。

CSSは特に <head> が基本
CSSが遅れると見た目が一瞬崩れて見えたり(チラつき)しやすいです。
例外:JSで動的に追加するケース
状況によっては、ユーザーの操作に合わせて preload / prefetch を追加したいこともあります。そのときは <body> 内に挿入されることもありますが、まずは <head> に置く前提でOKです。

rel でよく使うもの(実務の登場率が高い順)

ここからは「よく見る書き方」を、目的別に整理します。どれも rel が違うだけで、目的も変わります。

stylesheet:CSSを適用する
見た目を整えるための外部CSSを読み込みます。
icon:サイトのアイコン(タブやブックマーク等)
ファビコンなど。環境によって最適サイズが違うので、必要なら sizes を付けます。
apple-touch-icon:iOS系のホーム画面アイコン
iPhone/iPadでホームに追加したときのアイコンに使われることがあります。
canonical:このページの正規URL
同じ内容が複数URLで見えるときに「代表はこれ」と伝えて、検索・共有のブレを減らします。
alternate:別言語版、別形式(例:PDF)
言語切り替えなら hreflang、形式なら type とセットになりやすいです。
manifest:PWAのマニフェスト
アプリの名前・アイコン・表示モード等をまとめたファイルへのリンクです。

アイコン系:よくあるセット

最小構成ならこれでも十分です(運用方針で増やしてOK)。

HTML

<link rel="icon" href="/favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-180x180.png">

「どのサイズを用意すべきか」はサイト方針次第です。まずは “確実に1つ動く” を作ってから増やすのが安全です。

正規URL:canonical(事故予防にも効く)

canonical は「検索エンジン向けのやつでしょ?」と思われがちですが、運用が増えるほど“事故予防”になります。

こういうとき、正規URLを明示しておくと「代表はこれ」と揃えやすくなります。

HTML

<link rel="canonical" href="https://example.com/products/123">

運用ルールの例:正規URLは常に200で表示できるURLにする末尾スラッシュの統一http→https の統一

別言語版:alternate + hreflang

同じ内容を日本語ページと英語ページで持つ場合などに使います。ブラウザが勝手に切り替えるものではなく、「このページの別言語はこれ」と検索エンジン等に伝える用途が中心です。

HTML

<link rel="alternate" hreflang="ja" href="https://example.com/ja/">
<link rel="alternate" hreflang="en" href="https://example.com/en/">

言語ページ同士で相互に揃える(お互いに alternate を持つ)運用にしておくと、後から追加する時も迷いにくいです。

パフォーマンス最適化:preload / prefetch / preconnect

ここからは “中級者以上で効いてくる” やつです。ページの体感速度が気になってきたら、<link> の出番が増えます。

preload:今の表示に必要だから、優先して取りに行って
重要リソースを先に確保したいとき。ただし「取る予約」なので、実際に使う指定が別に必要です。
prefetch:次に必要になりそうだから、余裕があるときに取っておいて
次ページのJSや画像など。「今すぐ必須」ではないもの向けです。
preconnect:次に使うドメインに、先に接続準備しておいて
DNS/TCP/TLSまで含めた準備。効くと速いですが、無駄打ちすると逆効果になりやすいので、対象は絞ります。

preload の典型(CSS)

HTML

<link rel="preload" href="/assets/critical.css" as="style">
<link rel="stylesheet" href="/assets/critical.css">

よくある事故:preload だけ書いて満足してしまう(=予約したのに使っていない)。必ず “使用する書き方” をセットにします。

preconnect の典型(CDN)

HTML

<link rel="preconnect" href="https://cdn.example.com" crossorigin>

crossorigin が必要かは配信形態次第です。特にフォントやCDNは絡みやすいので、問題が出たら “ここを疑う” くらいで覚えると実務で助かります。

セキュリティ:SRI(integrity)と crossorigin

CDNのCSS/JSを使うとき、「もし中身が差し替わったら?」という不安に備えるのが SRI(Subresource Integrity)です。ざっくり言うと、integrity にハッシュを書いておくと、ブラウザが一致しないファイルを拒否できます。

HTML

<link
    rel="stylesheet"
    href="https://cdn.example.com/lib/v1.2.3/lib.min.css"
    integrity="sha384-..."
    crossorigin="anonymous"
>
integrity
ファイル内容のハッシュを指定します。CDN側の内容が変わると一致せず、読み込みを止めます。
crossorigin
別オリジンの取得で挙動が変わる場面に関係します。SRIと組み合わせることが多いです。

実務メモ:CDNのURLをバージョン固定にする/integrity の更新手順を決めておく、までセットにすると運用が安定します。

よくある誤解・落とし穴(ここでつまずきやすい)

<link> を書いたのに何も変わらない
多くの場合 “変わっていないのではなく、見た目に出ないだけ” です。CSS以外(canonical / alternate / preload等)は見た目が変わらないのが普通です。
preload が効かない(または警告が出る)
preload は予約です。使う指定(CSSなら rel="stylesheet"、フォントなら実際にそのフォントを使うCSS等)が必要です。as の指定ミスでもズレます。
アイコンが変わらない
キャッシュの影響が強いです。ブラウザのキャッシュをクリアするか、ファイル名を変える(favicon-v2.ico など)運用にすると楽になります。
canonical のURLが間違っている
正規URLが404だったり、ページ内容と矛盾していると逆に混乱します。「常に表示できるURL」を徹底します。

Sample

このサンプルは「よくあるセット」を1つの <head> に集めたものです。必要なものだけ残して削ってOKです。

HTML

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>ページタイトル</title>

    <!-- CSS -->
    <link rel="stylesheet" href="/assets/site.css">

    <!-- Icon -->
    <link rel="icon" href="/favicon.ico">

    <!-- Canonical (必要なら) -->
    <link rel="canonical" href="https://example.com/page">

    <!-- Performance hint (必要なら) -->
    <link rel="preconnect" href="https://cdn.example.com" crossorigin>
</head>

大事なのは “全部盛り” ではなく、目的があるものだけ入れることです。<link> は便利ですが、増やしすぎると管理が難しくなります。

よくある質問(FAQ)

<link><a> は何が違いますか?
<a> はユーザーがクリックして移動する“リンク”。<link> はブラウザや検索エンジンに渡す“関連付け”。用途が別物です。
rel は必須ですか?
実質必須だと思ってOKです。rel が無いと「何の関係か」が分からず、<link> の意味が薄くなります。
CSSは複数書いていいですか?
もちろんOKです。機能ごとに分けたいときは複数にします。ただし読み込み数が増えるので、必要なら統合や最適化を検討します。
preload はとりあえず入れれば速くなりますか?
“当たれば速い” ですが、無駄打ちすると逆に遅くなることもあります。まずはボトルネックを把握して、対象を絞って入れるのが安全です。
SRI(integrity)は必ず必要ですか?
必須ではありませんが、CDN依存が強いほど「入れておくと安心」です。運用で更新する仕組みがあるなら検討価値が高いです。

よくあるエラー・誤用早見表

CSSが当たらない
原因:href のパス違い/404。対処:DevToolsのNetworkでCSSが取得できているか確認します。
preload の警告が出る(予約したのに使っていない系)
原因:preload が“取得予約”で止まっている。対処:CSSなら rel="stylesheet" を併記、JS/フォントも実際の使用をセットにします。
フォントの preload でCORSっぽい問題が出る
原因:別オリジン取得で crossorigin が必要な配信形態。対処:crossorigin を付ける/サーバー設定も確認します。
canonical を入れたのにURLが揃わない
原因:正規URLがズレている/ページ間で矛盾。対処:正規URLが常に200で返ること、重複ページが同じcanonicalを指すことを確認します。
アイコンが変わらない
原因:キャッシュ。対処:キャッシュクリア、またはファイル名(URL)を変更して更新を確実にします。

このページに出てくる用語ミニ辞典

外部リソース(external resource)
今のHTMLファイルの外側にある“読み込む対象”。代表はCSS、アイコン、マニフェスト、フォント、別ファイルのモジュールなどです。
関連付け(relationship)
link は「このページと外部リソースは、こういう関係です」を伝える要素で、その“関係”を表す中心が rel です。
rel(relationship)
stylesheet / icon / canonical / preload など、関係の種類を指定します。まずは「rel が主役、href は相手の場所」と覚えると迷いにくいです。
href(hypertext reference)
関連付けたい対象のURL(またはURLっぽい参照)です。base を使っていると相対パスの解釈が変わるので注意します。
相対URL / 絶対URL
相対URLは ./../ のように“基準からの位置”で書くURL、絶対URLは https:// から始まるフルのURLです。
base(base URL)
相対URLの「基準」を上書きできる仕組みです。便利ですが、意図せずリンク全体がズレる事故が起きやすいので、採用するなら運用ルールが必要です。
canonical
検索エンジン向けに「このページの正規URLはこれです」と伝える合図です。同じ内容が複数URLで見えるときに役立ちます。
icon / apple-touch-icon
ブラウザのタブやブックマーク、ホーム画面追加で使われるアイコンです。sizes を付けて、適切なサイズを渡します。
manifest
PWA(ホーム画面追加など)の設定ファイルを指します。アプリ名、アイコン、表示モードなどの情報をまとめます。
先読み(Resource Hints)
「このあと必要になりそうだから、今のうちに準備してね」とブラウザに頼むテクニック群で、代表が preload / prefetch / preconnect / dns-prefetch です。
as
preload で「これは何として使う?」(style / script / font など)を宣言するための属性です。宣言がズレると効果が落ちたり警告が出たりします。
integrity(SRI: Subresource Integrity)
外部リソースが改ざんされていないかをハッシュで検証する仕組みです。CDN利用時の防御として強力ですが、更新時にハッシュも更新が必要です。
crossorigin / CORS
別オリジン(ドメインやポートが違う場所)から読み込むときの扱いに関わります。フォントやSRI、preload で重要になることが多いです。
MIME type
ファイルの種類を表す“中身のタイプ”です。CSSなら text/css、JavaScriptなら text/javascriptapplication/javascript のように、サーバーが返すヘッダーで決まります。
alternate / hreflang
多言語・地域別ページがあるときに「このページの別バージョンはこれ」と関連付けるために使います。SEOにも関わるため、正確な対応関係が大事です。
modulepreload
ES Modules(type="module")の読み込みを前倒しする仕組みです。依存モジュールを含めて効率よく準備できます。