JavaScript で現在のページの URL を取得するには window.location オブジェクトを使います。URL 全体だけでなく、プロトコル・ホスト名・パス・クエリパラメータ・ハッシュなど各パーツを個別に取得できます。
本記事では、location の全プロパティ、URL オブジェクトでの安全なパース、URLSearchParams でクエリパラメータを取得する方法、SPA での URL 監視まで解説します。
この記事でわかること
・window.location.href で URL 全体を取得する方法
・location の各プロパティ(protocol / hostname / pathname / search / hash)の違い
・URL オブジェクトで任意の URL をパースする方法
・URLSearchParams でクエリパラメータを取得・操作する方法
・document.URL / document.referrer との違い
・SPA(React / Vue)での URL 監視
・実務パターン(パラメータ判定 / リダイレクト / OGP 動的設定)
・window.location.href で URL 全体を取得する方法
・location の各プロパティ(protocol / hostname / pathname / search / hash)の違い
・URL オブジェクトで任意の URL をパースする方法
・URLSearchParams でクエリパラメータを取得・操作する方法
・document.URL / document.referrer との違い
・SPA(React / Vue)での URL 監視
・実務パターン(パラメータ判定 / リダイレクト / OGP 動的設定)
window.location の全プロパティ
例として次の URL のページにいる場合を考えます。
| プロパティ | 取得値 | 説明 |
|---|---|---|
| location.href | https://example.com:8080/blog/post?id=42&lang=ja#section2 | URL 全体 |
| location.protocol | https: | プロトコル(末尾にコロン) |
| location.hostname | example.com | ホスト名(ポート番号なし) |
| location.host | example.com:8080 | ホスト名 + ポート番号 |
| location.port | 8080 | ポート番号(デフォルトポートなら空文字) |
| location.pathname | /blog/post | パス(ドメイン以降、? の前まで) |
| location.search | ?id=42&lang=ja | クエリ文字列(? を含む) |
| location.hash | #section2 | フラグメント(# を含む) |
| location.origin | https://example.com:8080 | プロトコル + ホスト + ポート |
JavaScript(各プロパティの取得例)
// URL 全体 console.log(window.location.href); // "https://example.com:8080/blog/post?id=42&lang=ja#section2" // 各パーツ console.log(location.protocol); // "https:" console.log(location.hostname); // "example.com" console.log(location.pathname); // "/blog/post" console.log(location.search); // "?id=42&lang=ja" console.log(location.hash); // "#section2" console.log(location.origin); // "https://example.com:8080"
window.location と location は同じ
window.location.href と location.href は同じオブジェクトを参照します。window. は省略可能です。ただしローカル変数に location という名前を使っている場合はシャドウイングに注意してください。URL オブジェクトで任意の URL をパースする
new URL() を使うと、任意の URL 文字列を安全にパースできます。location と同じプロパティでアクセスできます。
JavaScript(URL オブジェクト)
// 任意の URL をパース
const url = new URL("https://example.com/blog?id=42&lang=ja#sec2");
console.log(url.hostname); // "example.com"
console.log(url.pathname); // "/blog"
console.log(url.searchParams.get("id")); // "42"
console.log(url.searchParams.get("lang")); // "ja"
console.log(url.hash); // "#sec2"
// 相対 URL のパース(第 2 引数にベース URL)
const rel = new URL("/about", "https://example.com");
console.log(rel.href); // "https://example.com/about"
// 現在のページの URL をパース
const current = new URL(window.location.href);
| 方法 | 用途 |
|---|---|
| window.location | 現在のページの URL を取得・操作 |
| new URL(str) | 任意の URL 文字列をパース。API レスポンスの URL 解析等 |
| document.URL | location.href と同等(読み取り専用) |
URL オブジェクトは不正な URL でエラーを投げる
new URL("not-a-url") は TypeError をスローします。ユーザー入力の URL をパースする場合は try...catch で囲んでください。URLSearchParams でクエリパラメータを取得する
JavaScript(URLSearchParams)
// 現在の URL のクエリパラメータを取得
const params = new URLSearchParams(window.location.search);
// 特定のパラメータを取得
const id = params.get("id"); // "42"(文字列)
const lang = params.get("lang"); // "ja"
const missing = params.get("foo"); // null(存在しない場合)
// パラメータの存在チェック
if (params.has("id")) {
console.log("id パラメータが存在します");
}
// 全パラメータをループ
for (const [key, value] of params) {
console.log(`${key} = ${value}`);
}
// 同名パラメータが複数ある場合(?tag=js&tag=css)
const tags = params.getAll("tag"); // ["js", "css"]
クエリパラメータの追加・変更・削除
JavaScript(パラメータの操作)
const params = new URLSearchParams(window.location.search);
// 追加
params.set("page", "2");
// 削除
params.delete("lang");
// 変更後の URL を組み立て
const newUrl = `${location.pathname}?${params.toString()}${location.hash}`;
console.log(newUrl); // "/blog/post?id=42&page=2#section2"
// ページ遷移なしで URL を更新(pushState)
history.pushState(null, "", newUrl);
URLSearchParams の詳しい活用は「URL のパラメータを取得する方法」「URL パラメータを取得して処理を分岐する方法」も参照してください。
document.URL と document.referrer
| プロパティ | 内容 | 書き込み |
|---|---|---|
| window.location.href | 現在のページの URL | 可能(代入でページ遷移) |
| document.URL | 現在のページの URL(location.href と同等) | 読み取り専用 |
| document.referrer | 遷移元ページの URL | 読み取り専用 |
JavaScript(referrer の取得)
// 遷移元の URL を取得
console.log(document.referrer);
// "https://google.com/search?q=javascript+url"
// 直接アクセスや noopener の場合は空文字
if (document.referrer === "") {
console.log("直接アクセス(または referrer なし)");
}
document.referrer は信頼できない
referrer はブラウザの設定、
referrer はブラウザの設定、
Referrer-Policy ヘッダー、rel="noopener noreferrer" などで空になったり省略されたりします。セキュリティや認証の判定には使わないでください。location を使ったページ遷移
JavaScript(ページ遷移の方法)
// 別ページに遷移(履歴に残る)
window.location.href = "https://example.com/new-page";
// 別ページに遷移(location.assign: href 代入と同じ)
location.assign("https://example.com/new-page");
// 現在のページを置き換え(履歴に残らない = 戻るボタンで戻れない)
location.replace("https://example.com/new-page");
// 現在のページをリロード
location.reload();
| メソッド | 履歴 | 用途 |
|---|---|---|
| location.href = url / assign(url) | 残る | 通常のページ遷移 |
| location.replace(url) | 残らない | ログイン後のリダイレクト(戻れなくしたい場合) |
| location.reload() | ― | ページの再読み込み |
history.pushState で URL だけ変更する(SPA 向け)
JavaScript(pushState / replaceState)
// ページ遷移なしで URL を変更(SPA のルーティング)
history.pushState({ page: 2 }, "", "/blog?page=2");
// 履歴を置き換え(戻るボタンに影響しない)
history.replaceState(null, "", "/blog?page=2");
// popstate イベント: ブラウザの戻る/進むボタン検知
window.addEventListener("popstate", (event) => {
console.log("URL changed:", location.href);
console.log("State:", event.state);
});
pushState は scroll イベントのように URL を「変更する」だけ
pushState は URL バーの表示を変更するだけで、ページのリロードは発生しません。SPA フレームワーク(React Router / Vue Router)は内部でこの API を使っています。実務パターン集
パターン(1): クエリパラメータで処理を分岐
JavaScript
// ?mode=preview のときだけプレビューモードにする
const params = new URLSearchParams(location.search);
if (params.get("mode") === "preview") {
document.body.classList.add("preview-mode");
}
パターン(2): 現在の URL をクリップボードにコピー
JavaScript
async function copyCurrentUrl() {
try {
await navigator.clipboard.writeText(location.href);
alert("URL をコピーしました");
} catch (err) {
// フォールバック
prompt("URL をコピーしてください:", location.href);
}
}
パターン(3): 特定のドメインかどうか判定
JavaScript
// 本番環境かどうかを URL で判定
const isProduction = location.hostname === "example.com";
const isStaging = location.hostname === "staging.example.com";
const isLocal = location.hostname === "localhost";
if (isProduction) {
// 本番のみ: アナリティクスを読み込む
loadAnalytics();
}
パターン(4): ハッシュでタブを切り替え
JavaScript
// URL のハッシュ(#tab2)に応じてタブを表示
function showTabFromHash() {
const hash = location.hash; // "#tab2"
if (hash) {
document.querySelectorAll(".tab-content").forEach(el => el.hidden = true);
const target = document.querySelector(hash);
if (target) target.hidden = false;
}
}
// ページ読み込み時 + ハッシュ変更時
showTabFromHash();
window.addEventListener("hashchange", showTabFromHash);
パターン(5): OGP / canonical の動的設定
JavaScript
// canonical URL を動的に設定(SPA 向け)
const canonical = document.querySelector('link[rel="canonical"]');
if (canonical) {
canonical.href = location.origin + location.pathname;
}
// OGP の og:url を動的設定
const ogUrl = document.querySelector('meta[property="og:url"]');
if (ogUrl) {
ogUrl.content = location.origin + location.pathname;
}
よくある質問
Qlocation.href と document.URL の違いは?
Aどちらも現在のページの URL を返しますが、
location.href は書き込み可能(代入でページ遷移)、document.URL は読み取り専用です。通常は location.href を使ってください。Qlocation.search が空文字を返します
AURL にクエリパラメータ(
?key=value)がない場合、location.search は空文字 "" を返します。URLSearchParams でパースしても空のオブジェクトになるだけでエラーにはなりません。Qlocation.hash を変更するとページがリロードされますか?
Aリロードされません。
location.hash = "#new-section" は URL のハッシュ部分だけを変更し、ページのリロードは発生しません。hashchange イベントが発火します。QURLSearchParams は IE で使えますか?
AIE 11 では使えません。IE 対応が必要な場合は正規表現で
location.search をパースするか、ポリフィルを使ってください。ただし IE は 2022 年にサポート終了しているため、現在の開発では考慮不要なケースが多いです。Qnew URL() で相対パスをパースするには?
A
new URL("/about") はエラーになります。第 2 引数にベース URL を指定してください。new URL("/about", window.location.origin) → https://example.com/aboutQReact / Vue で URL を取得するには?
AVanilla JS の
window.location はフレームワーク内でも使えますが、React Router なら useLocation()、Vue Router なら useRoute() を使う方がリアクティブに URL の変化を検知できます。まとめ
JavaScript での URL 取得方法をまとめます。
| やりたいこと | 方法 |
|---|---|
| URL 全体を取得 | window.location.href |
| ホスト名だけ取得 | location.hostname |
| パスだけ取得 | location.pathname |
| クエリパラメータを取得 | new URLSearchParams(location.search).get(“key”) |
| ハッシュを取得 | location.hash |
| 遷移元の URL を取得 | document.referrer |
| 任意の URL をパース | new URL(“https://…”) |
| ページ遷移(履歴あり) | location.href = url / location.assign(url) |
| ページ遷移(履歴なし) | location.replace(url) |
| URL だけ変更(SPA) | history.pushState(state, “”, newUrl) |
URL パラメータの活用は「URL のパラメータを取得する方法」「URL パラメータを取得して処理を分岐する方法」、jQuery での URL 操作は「現在の URL を取得・操作する完全ガイド」も併せて参照してください。

