記事内にはプロモーションが含まれています

PHPで現在のURLを取得する方法を完全網羅!パラメータやドメインの取得も解説

PHPで現在のURLを取得する方法を完全網羅!パラメータやドメインの取得も解説 プログラミングの疑問解決
「現在のページのURLを元に、canonicalタグを出力したい」
「URLパラメータによって、表示するコンテンツを切り替えたい」
「リダイレクト先のURLを動的に生成したい」

このように、Webサイト制作やシステム開発を行っていると、現在表示しているページのURLを取得したい場面が頻繁に訪れます。

PHPでは、スーパーグローバル変数である$_SERVERを活用することで、URLに関するあらゆる情報を取得することが可能です。

この記事では、PHPを使って現在のURLを取得する基本の方法から、ドメインやパラメータといったパーツごとの取得方法、さらにはURLを自在に操作する応用テクニックまで幅広く解説していきます。

【著者プロフィール&本記事の信頼性】
プロフィール
  • 著者は元エンジニア
  • 大手プログラミングスクールのWebディレクター兼 ライターを経験
  • 自らも地元密着型のプログラミングスクールを運営
プロフィール詳細はコチラ
日本最大級の比較サイトで「4年連続人気NO.1」!
SNSでの評判の良さも圧倒的なプログラミングスクール『RUNTEQ(ランテック)』!
【RUNTEQの特徴】
✅受講生からの評判が驚くほど良い
✅学習はハードだが未経験とは思えないほど高いスキルが身に付く
挫折させない万全なサポート体制が用意されている
✅採用面接で担当者に刺さるレベルの高い「ポートフォリオ」を作成できる
✅給付金を使えば実質約13万円という格安料金で受講できる
当ブログ著者
当ブログ著者
忖度一切なしで、未経験から本気で
エンジニア転職を目指すならRUNTEQ一択です。

\勧誘行為は一切なし! 相談だけでもOK! /

PHPで現在のURLを取得する最も確実な方法

まずは、多くの人が求めている「現在アクセスされているページの完全なURL(フルパス)」を取得する方法から見ていきましょう。

実はPHPには「現在のURLを一発で返す関数」というものは存在しません。

そのため、プロトコル(http/https)、ホスト名(ドメイン)、URI(パス)をそれぞれ取得し、結合する必要があります。

このセクションでは、ロードバランサー環境やセキュリティも考慮した、より堅牢でコピペで使えるコードと、その仕組みを解説します。

プロトコル・ドメイン・URIを結合するコード

現在のURLを構成する要素は、すべて$_SERVERという変数の中に格納されています。
これらを組み合わせることで、フルパスを生成します。

<?php
// 1. プロトコル(httpかhttpsか)の判定
// HTTPSが有効、またはポート443番(HTTPS標準ポート)の場合を考慮
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443 ? "https://" : "http://";

// 2. ホスト名(ドメイン)の取得
// HTTP_HOSTが取得できない場合(CLIモード等)はSERVER_NAMEをバックアップとして使用
$host = $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'] ?? 'localhost';

// 3. リクエストURI(パスとクエリパラメータ)の取得
// 取得できない場合は空文字とする
$uri = $_SERVER['REQUEST_URI'] ?? '';

// 4. すべて結合して完全なURLを作成
$current_url = $protocol . $host . $uri;

// 結果の出力(XSS対策のためエスケープ処理を行う)
echo "現在のURL: " . htmlspecialchars($current_url, ENT_QUOTES, 'UTF-8');
?>

実行結果は以下の通りです。
https://example.com/blog/article.php?id=123 にアクセスした場合)

現在のURL: 
https://example.com/blog/article.php?id=123
(https://example.com/blog/article.php?id=123)

コードの詳しい解説

このコードでは、以下の3つの要素を取得して結合しています。
単純な取得だけでなく、実務で発生しうるケースに対応しています。

  1. プロトコルの判定 単に$_SERVER['HTTPS']onかどうかを見るだけでは不十分な場合があります(一部の環境では1yesが返ることもあるため)。そこで、空でないことの確認に加え、SERVER_PORTが443であるかもチェックすることで、より確実にhttpshttpかを判定しています。 ※ロードバランサー配下などではHTTP_X_FORWARDED_PROTOの確認が必要な場合もあります。
  2. ホスト名の取得 $_SERVER['HTTP_HOST']を使用しますが、これが未設定の場合(CLIモードでの実行時など)に備えて$_SERVER['SERVER_NAME']をフォールバックとして使用しています。 注意: HTTP_HOSTはクライアント(ブラウザ)から送信されるヘッダー情報であり、改ざんされる可能性があります。信頼できない環境で使用する場合は、許可されたドメインリストと照合するなどの検証が必要です。
  3. リクエストURIの取得 $_SERVER['REQUEST_URI']には、ドメインより後ろの部分(パスとクエリパラメータ)がすべて入っています。例えば/blog/article.php?id=123のような文字列です。

最後に、画面に出力する際はXSS(クロスサイトスクリプティング)対策として、必ずhtmlspecialchars関数を通してエスケープ処理を行います。

URLの各パーツを個別に取得する方法

フルパスではなく、「ドメイン名だけ知りたい」「ファイル名だけ知りたい」というケースも多々あります。

ここでは、$_SERVER変数を使ってURLの各パーツをピンポイントで取得する方法を紹介しましょう。

ドメイン名(ホスト名)のみ取得

ドメイン名だけが必要な場合は、$_SERVER['SERVER_NAME']または$_SERVER['HTTP_HOST']を使用します。

<?php
echo $_SERVER['HTTP_HOST'];
?>

実行結果は以下の通りです。

example.com

一般的にはHTTP_HOSTを使うことが推奨されます。
これはリクエストヘッダーに含まれるHostフィールドの値を参照するため、より実際のアクセス状況に即した値が得られるからです。

パス(ドメイン以下の部分)のみ取得

ドメイン以下のディレクトリやファイル名を取得したい場合は、先ほども登場した$_SERVER['REQUEST_URI']を使います。

<?php
// 例: 
Example Domain
(https://example.com/dir/page.php?q=search) にアクセス echo $_SERVER['REQUEST_URI']; ?>

実行結果は以下の通りです。

/dir/page.php?q=search

パラメータを含まず、純粋にファイルパスだけを取得したい場合は、$_SERVER['SCRIPT_NAME']や、後述するparse_url関数を利用すると便利です。

リファラ(直前のページのURL)を取得

ユーザーがどこのページからリンクを辿ってやってきたか(遷移元URL)を知りたい場合は、$_SERVER['HTTP_REFERER']を使用します。

<?php
if (isset($_SERVER['HTTP_REFERER'])) {
    echo "前のページ: " . $_SERVER['HTTP_REFERER'];
} else {
    echo "直接アクセス、またはリファラなし";
}
?>

ただし、リファラはブラウザやセキュリティソフトの設定によって送信されないことがあるため、処理の必須条件として依存しすぎないよう注意が必要です。

URLパラメータ(クエリ文字列)の取得と操作

検索機能やページネーションなど、URLの末尾につく「?key=value」形式のパラメータ(クエリ文字列)を扱うことは、Web開発において非常に重要です。

しかし、ここは最もセキュリティ脆弱性(XSS)を作り込みやすい箇所でもあります。必ず適切な処理を行いましょう。

特定のパラメータの値を取得する ($_GET と filter_input)

特定のパラメータの値を取得するには、スーパーグローバル変数$_GETを使用します。

現代のPHP(7.0以降)では、Null合体演算子??を使うことで、値が存在しない場合のデフォルト値を簡潔に指定できます。

【重要】
取得した値を画面に表示する際は、必ずhtmlspecialcharsでエスケープしてください。これを怠るとXSS攻撃の標的になります。

例:https://example.com/search.php?category=book&page=2 にアクセスした場合

<?php
// 'category' パラメータの値を取得(存在しない場合は'未指定')
$category = $_GET['category'] ?? '未指定';

// 'page' パラメータの値を取得(存在しない場合は1)
$page = $_GET['page'] ?? 1;

// セキュアに出力(htmlspecialcharsは必須)
echo "カテゴリ: " . htmlspecialchars($category, ENT_QUOTES, 'UTF-8') . "<br>";
echo "ページ: " . htmlspecialchars($page, ENT_QUOTES, 'UTF-8');
?>

実行結果は以下の通りです。

カテゴリ: book
ページ: 2

より安全な取得方法:filter_input()

さらに安全性を高めるなら、filter_input()関数が推奨されます。
値の取得と同時に、フィルタリング(サニタイズや検証)を行えます。

<?php
// GETパラメータ 'page' を取得し、整数として妥当か検証する
// 失敗や未指定の場合は false や null が返るため、デフォルト値 1 を設定
$page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT) ?: 1;

echo "現在のページ: " . $page;
?>

パラメータ部分全体を文字列として取得する

パラメータのキーや値ではなく、「?」以降の文字列全体をそのまま取得したい場合は、$_SERVER['QUERY_STRING']を使います。

<?php
// 出力時はエスケープ推奨
echo htmlspecialchars($_SERVER['QUERY_STRING'], ENT_QUOTES, 'UTF-8');
?>

実行結果は以下の通りです。

category=book&page=2

現在のURLにパラメータを追加・変更する

「現在のURLのパラメータの一部だけを変更したい(例:ページ番号だけ変える)」という場合は、http_build_query関数を使います。

また、リンク先URLの生成には、XSS脆弱性のある$_SERVER['PHP_SELF']ではなく、より安全な$_SERVER['SCRIPT_NAME']を使用するのが鉄則です。

安全なページネーションリンク生成の実装例

<?php
/**
 * 安全なページネーションURLを生成する関数
 */
function buildPaginationUrl($page) {
    // 1. 現在のパラメータを配列として取得
    $params = $_GET;
    
    // 2. ページ番号を更新(整数化して不正な値を防ぐ)
    $params['page'] = max(1, (int)$page);
    
    // 3. 配列を再びクエリ文字列に変換
    // http_build_queryは自動的にURLエンコードを行ってくれます
    $new_query = http_build_query($params);
    
    // 4. スクリプト名(パス)を取得(PHP_SELFより安全)
    $script_path = $_SERVER['SCRIPT_NAME'];
    
    // 5. URLを生成して返す(出力時にエスケープするため、ここは生のURL)
    return $script_path . '?' . $new_query;
}

// 3ページ目へのリンクを表示
$next_url = buildPaginationUrl(3);

// HTMLに出力する際は必ずエスケープ!
echo '<a href="' . htmlspecialchars($next_url, ENT_QUOTES, 'UTF-8') . '">3ページ目へ</a>';
?>

実行結果(HTMLソース):

<a href="/search.php?category=book&amp;page=3">3ページ目へ</a>

この方法を使えば、既存の他のパラメータ(categoryなど)を維持したまま、安全に特定のパラメータだけを書き換えることができます。

URL文字列を分解して解析する (parse_url)

現在のページのURLではなく、データベースに保存されたURLや、ユーザーが入力した任意のURL文字列を解析したい場合は、parse_url関数が非常に役立ちます。

この関数を使うと、URLを構成要素ごとに配列に分割してくれます。

parse_url関数の使い方

<?php
$url = "
https://user:pass@example.com:8080/path/to/file.php?arg=value#anchor
(https://user:pass@example.com:8080/path/to/file.php?arg=value#anchor)"; // URLを解析 $parsed = parse_url($url); echo "<pre>"; print_r($parsed); echo "</pre>"; ?>

実行結果は以下の通りです。

Array
(
    [scheme] => https
    [host] => example.com
    [port] => 8080
    [user] => user
    [pass] => pass
    [path] => /path/to/file.php
    [query] => arg=value
    [fragment] => anchor
)

このように、scheme(プロトコル)、host(ドメイン)、path(パス)、query(パラメータ)などに自動的に分解してくれるため、文字列操作関数で無理やり切り出すよりも遥かに安全かつ簡単にURLを扱えます。

URL取得時のセキュリティ対策(XSSの防止)

URLを取得して画面に表示する際、絶対に忘れてはならないのがセキュリティ対策です。

$_SERVER$_GETから取得した値には、クロスサイトスクリプティングやXSS攻撃など、悪意のあるスクリプトが含まれている可能性があります。

取得したURLをHTMLとしてブラウザに出力する場合は、必ずhtmlspecialchars関数を使ってエスケープ処理を行ってください。

安全な出力の例

<?php
// 現在のURLを取得
$current_url = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

// そのまま出力するのは危険!
// echo "<a href='" . $current_url . "'>リンク</a>"; 

// htmlspecialcharsを通して無害化してから出力する
$safe_url = htmlspecialchars($current_url, ENT_QUOTES, 'UTF-8');

echo "<a href='" . $safe_url . "'>現在のページへのリンク</a>";
?>

特に$_SERVER['REQUEST_URI']$_GETの値は、ユーザーがブラウザのアドレスバーで自由に書き換えられる値です。

これをそのままechoすることは、セキュリティホールを自ら作っているのと同じことだと認識しておきましょう。

初心者がPHPでのURL取得について効率的に学ぶには

PHPでのURL取得をはじめとするPHPのスキルを効率的に習得するには、プログラミングスクールの活用が最も近道です。

スクールでスキルを高めることにより、今の仕事に活かしたり、副業として高単価な案件を受注できたりするだけでなく、PHPエンジニアとして転職することも可能になります。

PHPエンジニアは需要が非常に高いため、それに比例して年収も高くなる傾向にあります。
「今よりも年収を上げたい」「将来性の高い職種であるエンジニアへ転職したい」といった気持ちが強い場合は、プログラミングスクールでPHPの専門スキルを習得しつつ、ポートフォリオ支援や転職支援を受けてエンジニアへ転職する、という道を目指すのもよいでしょう。

なお、「PHPに強く、受講生からの評判も良いプログラミングスクール」には、以下のようなところがあります。

  • RUNTEQ(※受講生からの評判が圧倒的に良い)
  • デイトラ(※格安料金で学べる)
  • DMM WEBCAMP(※受講コースが豊富)

その他、以下の記事でもPHPのおすすめスクールをまとめていますので、興味のある方は是非参考にしてください。