イントロダクション
Webページの URL をブラウザ側で動的に取得しようとした場合、考慮すべきことがあります。url:webページの同一性を考える-同じコンテンツでもURLに複数のバリエーションが出来てしまう!
http://upa-pc.blogspot.com/2015/03/url-same-content-or-different.html
javascript:WebページのURLをlocationからではなく、HTML文書中のcanonicalから取得する理由
http://upa-pc.blogspot.com/2015/03/javascript-why-should-get-the-url-from-canonical.html
それを考慮すると、正規化されたURL(link タグの ref 属性に "canonical" が指定されているものの、href 属性の値)を取得したいケースがあります。
正規化された URL とは?
正規化されたURL は、同じコンテンツなのに、異なる URL を持つために重複して検索エンジンに認識されるのを防ぐために HTML 文書中に記載する URL です。
正規 URL を使用する - ウェブマスター ツール ヘルプ
https://support.google.com/webmasters/answer/139066?hl=ja
https://support.google.com/webmasters/answer/139066?hl=ja
canonical属性とは/link rel="canonical"によるURL正規化タグ——SEOにとって非常に重要な進歩(前編) | Moz - SEOとインバウンドマーケティングの実践情報 | Web担当者Forum
http://web-tan.forum.impressrd.jp/e/2009/03/05/5112
http://web-tan.forum.impressrd.jp/e/2009/03/05/5112
そのため、その正規化されたURLは、その Web ページの作成者が、その Web ページをどんな URL として扱って欲しいのかを明示的に示したものです。
従って、Webページの URL をブラウザ側で動的に取得しようとした場合、location オブジェクトから取得する場合には、URL の表記に様々なバリエーションが生まれてしまいますが、正規化された URL を用いれば、そのコンテンツに対する URL を一つに限定できます。
正規化された URL は、次のように HTML 文書中に link タグの ref 属性に "canonical" が指定されているものの、href 属性の値として記載されます。
<link href='正規化されたURL' rel='canonical'/>
そこで、正規化されたURL(link タグの ref 属性に "canonical" が指定されているものの、href 属性の値)を取得する JavaScript を作成してみました。
正規化されたURL(link タグの ref 属性に "canonical" が指定されているものの、href 属性の値)を取得する JavaScript
JavaScript コード
<script type="text/javascript"> <!-- /* link タグの ref = canonical に指定された、href を取得します 戻り値: link タグの ref = canonical に指定された、href 見つからなかった場合、null */ function getCanonicalUrl() { var links = document.getElementsByTagName("link"); for (var i = 0; i < links.length; i++) { if (links[i].rel) { if (links[i].rel.toLowerCase() == "canonical") { return links[i].href; } } } return null; } //--> </script>
解説
上記の getCanonicalUrl 関数を実行すると、正規化されたURL(link タグの ref 属性に "canonical" が指定されているものの、href 属性の値)を取得することができます。html 文書内に、ref 属性に "canonical" が指定されている link タグが無い場合には、null を返します。
詳細解説
<script type="text/javascript"><!--
HTML 文書内に JavaScript コードを埋め込みます。
function getCanonicalUrl() {
getCanonicalUrl という名前の関数を定義しています。
var links = document.getElementsByTagName("link");
HTML 文書内の link タグを全て、配列として取得します。
for (var i = 0; i < links.length; i++) {
HTML 文書内の link タグをすべて検査します。
if (links[i].rel) {
link タグに、rel 属性があることを確認します。
if (links[i].rel.toLowerCase() == "canonical") {
link タグの ref 属性の値が canonical である要素を探します。
なお、ref 属性の値は、大文字・小文字を区別しないため(*1)、toLowerCase() によって、いったん ref 属性の値をすべて小文字にした後(CANONICAL -> canonical)、"canonical" と一致するかどうかを比較しています。
*1:
Links in HTML documents
return links[i].href;
link タグの ref 属性に "canonical" が指定されているものの、href 属性の値を返却して、この関数の実行を終了します。
}
}
}
return null;
ref 属性に "canonical" が指定されている link タグ が見つからなかった場合には、null を返却して、この関数の実行を終了します。
}
getCanonicalUrl という名前の関数の定義はここまでです。
//-->
</script>
HTML 文書内への JavaScript コードを埋め込みはここで終了です。
サンプルコード
正規化された URL を取得して、画面上に表示するサンプルプログラムを以下に掲載します。正規化された URL を取得して、画面上に表示するサンプルプログラム:
<b>正規化された URL:</b><br /> <div id="canonical-url-view"> </div> <script type="text/javascript"> <!-- /* link タグの ref = canonical に指定された、href を取得します 戻り値: link タグの ref = canonical に指定された、href 見つからなかった場合、null */ function getCanonicalUrl() { var links = document.getElementsByTagName("link"); for (var i = 0; i < links.length; i++) { if (links[i].rel) { if (links[i].rel.toLowerCase() == "canonical") { return links[i].href; } } } return null; } (function () { var canonical_url = getCanonicalUrl(); var obj_output = document.getElementById("canonical-url-view"); obj_output.appendChild(document.createTextNode(canonical_url ? canonical_url : "正規化された URL は見つかりませんでした。")); })(); //--> </script>
実行結果
実際にこの関数を使用して、このブログページの正規化された URL を取得した結果を示します。正規化された URL:
正常に実行できていれば、以下の URL が表示されています。
http://upa-pc.blogspot.com/2015/03/javascript-canonical-url-get.html
まとめ
このように、Webページの URL をブラウザ側で動的に取得しようとした場合、正規化されたURL(link タグの ref 属性に "canonical" が指定されているものの、href 属性の値)を取得すると便利です。なお、Web ページによっては、正規化された URL が記載されていないこともあります。
その場合には、代替手段として locationオブジェクトから取得するなどの方法を行う必要があります。
関連記事
JavaScript:location.hrefの注意点 - URLのドメイン前にベーシック認証が埋め込める、そして脆弱性 - Dr.ウーパのコンピュータ備忘録
http://upa-pc.blogspot.jp/2015/02/javascript-location-href-url-basic-trouble.html
JavaScript:ハッシュ(#)を含まない現在のページのURLを取得する - Dr.ウーパのコンピュータ備忘録
http://upa-pc.blogspot.jp/2015/02/javascript-url-hash-delete-location.html
JavaScript:URLのハッシュ(#)以降を削除する - Dr.ウーパのコンピュータ備忘録
http://upa-pc.blogspot.jp/2014/05/javascripturl.html
http://upa-pc.blogspot.jp/2015/02/javascript-location-href-url-basic-trouble.html
JavaScript:ハッシュ(#)を含まない現在のページのURLを取得する - Dr.ウーパのコンピュータ備忘録
http://upa-pc.blogspot.jp/2015/02/javascript-url-hash-delete-location.html
JavaScript:URLのハッシュ(#)以降を削除する - Dr.ウーパのコンピュータ備忘録
http://upa-pc.blogspot.jp/2014/05/javascripturl.html
コメントを投稿 (ここをクリックしてコメント投稿フォームを表示)
コメント投稿機能について