【SSL化】拡張子無しのページをPHPコードでhttpsへリダイレクト

WordPressではなく、HTMLサイトで、何らかの理由で下層ページのURLを拡張子無しで表示させている方もいらっしゃるかと思います。

私が運営しているサイトの中にも、拡張子無しで表示させているHTMLサイトがあります。

《参考》WEBサイトで拡張子なしのURLでもアクセスできるようにする

そのHTMLサイトもいよいよSSL化することになりました。

SSL化したサイトへリダイレクトする際、一般的には、.htaccessファイルに、以下のように記述すれば、http://からhttps://へサイト全体をリダイレクトできます。

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

しかし、この方法だと、HTMLサイトで拡張子無しで表示させていたページは、以下のようにリダイレクトされてしまいます。

http://example.com/page01
     ↓
https://example.com/page01.php

いくら拡張子を表示しないようにしていても、実際にサーバーにあるファイルは「page01.php」なので、拡張子付きのURLへリダイレクトするようです。

何とか、SSL化後のサイトURLへ拡張子無しでリダイレクトする方法をいろいろ探してみたのですが、.htaccessでリダイレクトさせる方法では、どうしても拡張子無しのURLへリダイレクトさせる方法が見つかりませんでした。

もちろん、「page01.php」と拡張子付きのURLへリダイレクトされてしまっても、canonicalタグで、拡張子無しの「page01」に正規化する方法もあります。

canonicalタグで正規化できることも、実際に試してみて確認済みです。

ただし、検索エンジンに対しては、拡張子無しで正規化できても、ユーザーがSSL化前の拡張子無しのページにアクセスした場合、拡張子付きのページにリダイレクトされるという事実は変わらず、ブラウザのアドレスバーには、拡張子付きのURLが表示されてしまいます。

表示されるだけならいいのですが、ユーザーがリンクを貼る際、ブラウザのアドレスバーに表示されている拡張子付きのURLでリンクを貼るため、拡張子有り無しでリンクが分散してしまうのです。

それでもcanonicalタグで正規化していれば、分散してしまっても結局は拡張子無しのURLで一本化できるので、良いと言えばいいのですが、できるだけ、最初から拡張子無しのURLにリダイレクトさせたいところです。

そこで、さらに、いろいろ調べてみたところ、PHPでページごとにリダイレクトをすれば、拡張子無しのURLでも、そのまま拡張子無しのURLにリダイレクトできることがわかりました。

PHPでページごとにhttpsへリダイレクトする方法

今回、PHPでページごとにhttpsへリダイレクトするには、下記PHPコードを各ページに記述し、成功しました。

1.成功した記述

<?php
if (empty($_SERVER['HTTPS'])) {
    header( "HTTP/1.1 301 Moved Permanently" ); 
    header("Location: https://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}");
    exit;
}
?>

// ↓以下通常のHTMLコードで、この上一番最初に記述
<!DOCTYPE html>
<html lang="ja">
<head>・・・・

《参考サイト》
さくらのレンタルサーバで常時SSL化するときに、http→httpsの転送でハマった話

なお、上記参考サイトでは、さくらのサーバーでは、上記コードだけではうまく作動せず、以下のような記述によって成功されたとのことです。

2.参考サイトで紹介されているさくらのサーバーに対する記述

<?php
if (isset($_SERVER['HTTP_X_SAKURA_FORWARDED_FOR'])) {
    $_SERVER['HTTPS'] = 'on';
    $_ENV['HTTPS'] = 'on';
}
if (empty($_SERVER['HTTPS'])) {
    header( "HTTP/1.1 301 Moved Permanently" ); 
    header("Location: https://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}");
    exit;
}
?>

しかし、今回利用するサーバーは同じくさくらだったのですが、さくらに対する記述抜きで、最初の1の記述だけで成功しました。

また、その他のサーバーでも、1の記述だけで大丈夫でした。

ただ、環境によっては、必要になってくるのかもしれませんので、ご自身の環境で一度試してみる必要があるかと思います。

なお、今回は、リダイレクト元のページは、PHPコードが有効な拡張子が「.php」のページでした。

拡張子が「.html」のページでは、上記PHPコードを記述しても動作しませんので注意が必要です。

また、上記PHPコードの記述場所は、必ず全htmlコードの一番最初でなければなりません。

大体は、htmlコードの一番最初は、<!DOCTYPE html>だと思いますので、改行や空白を入れず、<!DOCTYPE html>の前に記述します。

その他のPHPによるリダイレクトあれこれ

今回、上記記述にたどり着くまでに、いろいろ学んだPHPによるリダイレクトのいくつかを参考までに掲載したいと思います。

httpsからhttpへの逆リダイレクト

上記の記述で、httpからhttpsにリダイレクトを行い、その後、万が一、元に戻したい、つまり、httpsからhttpへの逆リダイレクトする場合にはどうすればよいのかなと思って、試行錯誤したのが、下記記述です。

httpsからhttpへの逆リダイレクトのコード

<?php
if ($_SERVER['HTTPS'] == "on") {
    header( "HTTP/1.1 301 Moved Permanently" ); 
    header("Location: http://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}");
    exit;
}
?>

上記記述で、httpsからhttpへの逆リダイレクトに成功しました。

URL変更に伴うリダイレクト

これは、SSL化に伴うhttpからhttpsへのリダイレクトではなく、単に、URL変更に伴い、別のページにリダイレクトを行う記述です。

これも上記参考サイトを参考にさせていただきました。

URL変更に伴うリダイレクトのコード

<?php
header( "HTTP/1.1 301 Moved Permanently" ); 
header( "Location: http://example.com/○○○" ); 
exit;
?>

冒頭で述べましたように、HTMLサイトで拡張子無しで運営しているサイトで、以前、ドメイン変更を行った際、.htaccessに一般的な301リダイレクトの記述でリダイレクトを行ったのですが、やはり、今回のSSL化に伴うリダイレクトと同様に、拡張子有りのページにリダイレクトされてしまった経緯があります。

// 一般的な.htaccessによるリダイレクト
Redirect permanent / http://example.com/

その時は、結局、上記のようなサイト一括でのリダイレクトではなく、.htaccessに拡張子無しのページごとのリダイレクトを記述をすることにより乗り切ったのですが、もっと早く、こうしたPHPによるリダイレクト法を知っておけばよかったのになと思います。

以上、SSL化に伴う拡張子無しのページをhttpsへページごとにリダイレクトする方法についてまとめてみました。

今回、HTMLサイトに適用した経緯について掲載いたしましたが、もちろん、WordPressサイトにおいても、有効な方法ではないかと思います。

もっとも、WordPressサイトの場合は、ページのURLはもともと拡張子無しなので、あまり役には立たないかと思いますが、ある特定のページのみhttpsのURLに飛ばすという使い方もできるのかなと思います。