CodeLog

URLの正規化

PHPでURLの正規化をおこなう方法を解説します。URL正規化のパターンも紹介します。

URL正規化とは?

URL正規化というのは、簡単に言えば「URLを統一すること」です。URLには、異なるURLであっても同じページが表示されるものがあります。例えば以下のような場合です。

・http://hoge.com/
・https://hoge.com/
・http://www.hoge.com/
・http://hoge.com/index.php

このような異なるURLを統一させるのがURL正規化です。もう少し具体的に言うと、1つのURLに統一するために違うURLでアクセスされた場合にはリダイレクトをおこない、統一したいURLに移動させます。

URLを正規化する目的は主に2つあります。

  • 非SSL通信をSSL通信にしてセキュリティ面を強化する
  • 異なるURLが違うページだと検索エンジンに認識されることを防ぐ

https・wwwなし・index.phpなしに統一

if(empty($_SERVER["HTTPS"]) || preg_match("/^www\./", $_SERVER['HTTP_HOST']) || preg_match("/index\.php$/", $_SERVER['PHP_SELF'])){
	$url = "https://" . preg_replace("/^www\./", "", $_SERVER["HTTP_HOST"]) . preg_replace("/index\.php$/", "", $_SERVER["PHP_SELF"]) . (!empty($_SERVER['QUERY_STRING']) ? "?".$_SERVER['QUERY_STRING']);
	header("Location: ".$url, true, 301);
	exit;
}

https・wwwあり・index.phpなしに統一

if(empty($_SERVER["HTTPS"]) || !preg_match("/^www\./", $_SERVER['HTTP_HOST']) || preg_match("/index\.php$/", $_SERVER['PHP_SELF'])){
	$url = "https://" . (!preg_match("/^www\./", $_SERVER['HTTP_HOST']) ? "www.") . $_SERVER['HTTP_HOST'] . preg_replace("/index\.php$/", "", $_SERVER["PHP_SELF"]) . (!empty($_SERVER['QUERY_STRING']) ? "?".$_SERVER['QUERY_STRING']);
	header("Location: ".$url, true, 301);
	exit;
}