2023年10月26日

Apache2によるhttp通信のhttps化とホームドメインの統一(www有無)

 

帰りの船から宮島朱の鳥居を望む
帰りの船から宮島朱の鳥居を望む


さて,前回はApache2へSSL(Let'sEncrypt)の設定方法を学習しました。今回はApache2を使ったhttp通信リクエストのhttps化とホームドメインの統一(www有り,無し)について,リダイレクト手法を学習します。

それでは,始めます。


  http通信リクエストのhttps化の必要性と設定方法

これは,サーバへのリクエストがhttp通信(非暗号)だった場合に,強制的にhttpsリクエスト通信にリダイレクトすることです。現在,多くのブラウザがhttps通信でない場合に注意喚起しますので,必須事項になりつつあります。

このリダイレクトの設定方法は,Apache2で行う以外にも,.htaccessファイルで設定することも出来ますが,それはWordPressを扱う時に併せて記述したいと思います。ここではapache2の仮想(Virtual)ホストの設定ファイルを修正する方法を記述します。

それではユーザのホームディレクリ「$」にログインして,次のコマンドを入力して下さい。

コード

sudo vim /etc/apache2/sites-available/domain_name.conf

ドメイン名(domain_name)は個々に違いますから,任意に変更してください。また,ここではテキストエディターにVimを利用しています。このファイルの最後(</VirtualHost>の前)に次の構文を追加して下さい。

コード

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

この構文では,RewriteEngineを起動して,Rewirteの条件と編集内容を指定しています。通信リクエスト文がHTTPS文字で始まっていない場合に,新しくhttps://で始まる通信リクエスト文にリダイレクトします。

 

  http通信リクエストのホームドメイン統一(www有り,無し)

これは,通信リクエストにおいてホームドメイン名がWWW有り,WWW無しであった場合,どちらか一方に統一したい時に設定されます。単純なホームページを出力するだけなら,別に統一しなくても良いのですが,他のサイトを活用したカスタムドメイン等を利用する場合やGoogle検索エンジンのSEO対策などを考えると統一した方がメリットがあります。

先ほどと同様に,apache2の仮想(Virtual)ホストの設定ファイルの追加構文に,次の構文を加えてください。(www有りに統一する場合)

コード

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

ここでは,通信リクエストにWWWが無い場合,「https://www.」で始まるように再編集しています。

^は文字列の最初,$は文字列の最後,(.*)は任意の文字列,!は否定(www.で無い)を表します。%{HTTP_HOST}は通信リクエスト文のホスト名,%{REQUEST_URI}は通信リクエストされたURLのドメイン名より後ろを表す変数になります。

もし,WWWが有る時にWWW無しにする場合は,次のように入力します。

コード

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI}  [R=301,L]

%1は直前のRewriteCondの(.*)で取得したホスト名(www無)が入ります。%{REQUEST_URI}は,$1と入力しても同じになります。

但し,正規化された表現で記述されていますので,必ずしも思いどおりにリダイレクトされるとは限りません。少しのコーディングミスでも内容が変わりますので,設定ファイルを変更した後,ブラウザ画面からのリダイレクト内容を確認するのが良いと思います。

因みに[NC]フラグは,大文字と小文字を区別せずに比較することを意味します。[R=301,L]フラグは,[R=301] はHTTPステータスコード301を返してリダイレクトすることを表すフラグです。「検索エンジンにURLを変更したことを伝える」という役割もあります。[L] は書き換えプロセスの終了を表すフラグです。この2つのフラグをまとめて [R=301,L] と記述します。


  http通信リクエストの設定構文のまとめ

以上から,http通信リクエストに対しては,次の追加構文をapache2の仮想(Virtual)ホストの設定ファイルに追加して下さい。(https化,www有りへ統一の場合)

コード

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

ここで,wwwへ統一する時に,https化も併せて変換していることにご注意ください。

  https通信リクエストのホームドメイン統一(www有り,無し)

http通信リクエストのリダイレクトは対応できましたが,ブラウザから直接https通信リクエストが入ってくる場合があります。その場合はhttpsへのリダイレクトは必要ないのですが,www有り無しの統一は必要になりますので,apache2の仮想(Virtual)ホストのSSL設定ファイルにも変更を加えます。

ユーザのホームディレクリ「$」にログインして,次のコマンドを入力して下さい。

コード

sudo vim /etc/apache2/sites-available/domain_name-ssl.conf

ドメイン名(domain_name)は個々に違いますから,任意に変更してください。また,ここではテキストエディターにVimを利用しています。このファイルの最後(</VirtualHost>ディレクティブの前)に次の構文を追加して下さい。

コード

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

これは,httpリクエスト通信の時と同じですから,説明は省略します。


  Certbot(Let'sEncrypt)のhttp認証を通す場合の考慮点

以上で,Apache2における通信リクエストのリダイレクト対応は出来ました。しかし,Certbot(Let’sEncrypt)を利用する場合において,http認証方式であるACME通信プロトコルでは,httpリクエスト通信でのリダイレクトを行わないようにしないと認証プロトコルが通らないことになります。

そのため,先ほどのhttpリクエスト通信におけるリダイレクト構文を以下のように変更してあげます。

コード

RewriteEngine on
RewriteCond %{REQUEST_URI} "!^/\.well-known/acme-challenge/.*"
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_URI} "!^/\.well-known/acme-challenge/.*"
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCondコマンドに,ACMEプロトコルで無い場合だけリダイレクトを行うように修正します。RewriteCond構文は,続けて書いた場合はAnd条件となります。OR条件にしたい場合は,RewriteCond構文の最後に[OR]または[OR,NC]と加えます。

なお,この設定は,SSL証明書取得に係るため,暗号化する前のhttp通信リクエストにのみ設定することになります。(/etc/apache2/sites-available/domain_name.confの変更)

一連の設定が終わったら,Apache2のテストとリスタートを忘れずに行います。


  Apache2設定の正常性確認とApache2のリスタート

Apache2の設定にエラーがないか確認します。

コード

sudo apache2ctl configtest

エラーが無い場合は,次のようにOutPutされます。

Output
Syntax OK

設定終了であれば,Apache2をリスタートします。

コード

sudo systemctl restart apache2

気付き
Apache2をリスタートした事でhttpリクエスト文はリダイレクトされるのですが,ブラウザのキャッシュをクリアしないと,どのように変わったかを確認できない時があります。念のため,ブラウザのキャッシュをクリアしてから確認テストをするように心掛けましょう。

  最後に

以上で,Apache2に係る設定は終了です。RewriteEngineを使うための変数名は,{HTTP_HOST}や{REQUEST_URI}以外にも沢山あります。必要な場合はインターネットをググれば,凄いエンジニアの方たちが,いろいろ教えてくれます。

取り合えず,Apache2の設定が済みましたので,今後の計画ではGoogle Apps Script(以降,GASという) ,IoT,WordPress,AI関係に進むことにしてしていますが,まずは実際の産業に適用範囲の広いIoT関係に進むことにいたします。

IoT系のプログラミングとしては,Pythonとnode-redがあります。小型コンピュータのラズベリーパイを使うことや,プログラム負担を軽減するといった制約から考えて,当面は,ローコードであるnode-redを使ったプログラミングに踏み込んでいきます。所々で,Python,GAS或いはWordPress,AI分析なども利用して進めてまいります。

それでは,次回はnode-redのインストールからです。


(注意)情報の正確性を期していますが,実施される場合には自己責任でお願いします。 

0 件のコメント: