メニューを開く

2021/06/06

Apache ~ .htaccess設定方法と使い方 リダイレクト ~

 

.htaccessファイルは、分散設定ファイルとも呼ばれ、Webサーバーの挙動を設定することができるファイルのひとつで、WebサーバーとしてApacheが使用されていて、管理者が.htaccessファイルの設置を許可していれば使用することができます。

設定方法


Apacheは、http.confにディレクティブという命令を記述することで設定しますが、http.confは管理者にしか編集できなくなっています。それに対して、.htaccessファイルは各ユーザーがディレクトリ単位に設定することができます。ファイルの構文は、主設定ファイルのhttp.confファイルと同じです。
注意事項
  • 基本的に、http.confファイルにアクセスできない場合以外は極力使用しない
  • FTPで転送する場合、ASCIIモードまたは、テキストモードを使用する
  • Windowsで編集する場合、一旦htaccess.txtなどに置き換え、サーバーに配置後にリネームする
  • 設置されたディレクトリと配下ディレクトリ全てに影響する
  • 構文誤りや管理者が許可していないディレクティブを使用した場合、該当ディレクトリ配下のファイルアクセスが、500 Internal Server Errorになる
  • 最終行には、改行を入れる

使い方

いろんな使い方ができるみたいですが。ざっくりとですが、こんなことができるみたいです。勉強しながら少しずつ記事にしていきたいと思っています。

使い方概要
  • セキュリティ関連
  • エラーページ制御
  • キャッシュ制御
  • ページ表示の高速化
  • 多言語対応
あれっ、よく見れば、リダイレクトが抜けていました。
ということで、今回はリダイレクトについて記事を書きます。

リダイレクト
リダイレクトとは、ドメインやページのURL、ファイル名やディレクトリ名が変更された時に使われるURLの自動転送処理のことです。.htaccessでファイルを用いたリダイレクトには、RedirectディレクティブとRewriteRuleディレクティブを用いた方法があります。

Redirectディレクティブ
Redirectディレクティブを用いて、URLの自動転送するための構文です。
Redirectディレクティブの詳細はこちらを参照。
構文
Redirect [status] URL-Path URL

URL-Path :転送元URL

      URL-Pathは、相対パスでなく、絶対パスで指定する

URL        :転送先URL

      URLは、スキーム名で始まる絶対URLで指定する

[status]   :キーワードを指定することでHTTPステータスコードを返せる

      キーワード HTTPステータス

                                      コード

                permanent      301     リソースを恒久的に移動した際に指定

                temp              302     リソースを一時的に移動した際に指定

                seeother         303     リソースを他のもので置き換えた際に指定

                gone               304     リソースが恒久的に削除した場合に指定

Redirectディレクティブは、パスが完全一致した場合に処理されます。正規表現を用いたマッチングを行いたい場合には、RedirectMatchディレクティブを利用します。


301リダイレクト

サイトやページを恒久的に移転先へ転送することで、ユーザーや検索エンジンが正しいページにたどり着くことができるようにする方法です。例えば、301 リダイレクトを使用してページの URL を変更するを参考にすると次のような場合です。
・サイトを新しいドメインに移転済みで、可能な限りシームレスに移行したい場合
・ユーザーが複数の異なる URL からサイトにアクセスする場合
・2つのウェブサイトを統合し、使わなくなったURLへのリンクが正しいページにリダイレクトされるようにしたい場合
301リダイレクトで、検索エンジンにリンクの評価が引き継がれて、サイトの評価をある程度は保つことが出来て、SEO効果があるとされているそうです。
Redirectディレクティブを使った転送の場合には、status引数にpermanentを指定することで301リダイレクトになります。つまり、次の構文のように記載することで、転送元URL-Path(/)を転送先URL(http://www.example.co.jp/)にリダイレクトすることが出来ますが、転送先に対応するファイルが存在しない場合には、HTTP 404 Not Foundになります。
記述例
Redirect permanent / http://www.sample.co.jp/
また、次の構文のように記載することで、特定ディレクトリ(/srce/)を別ディレクトリ(http://www.sample.co.jp/dest/)に転送することが出来ます。この場合も同様に、転送先に対応するファイルが存在しない場合には、HTTP 404 Not Foundになります。
記述例
Redirect permanent /srce/ http://www.sample.co.jp/dest/

さらに、次の構文のように記載することで、特定ページ(/srce/test.html)を別ページ(http://www.sample.co.jp/dest/test.php)に転送することが出来ます。

記述例
Redirect permanent /srce/test.html http://www.sample.co.jp/dest/test.php

RedirectMatchディレクティブ
RedirectMatchディレクティブは、Redirectディレクティブと機能的には、ほぼ同じですが、正規表現を用いてマッチングするところが異なります。
構文
RedirectMatch [status] regx URL
例えば、以下のように記述することによって、GIFファイルを全て別サーバーの同様な名前のJPEGファイルにリダイレクトすることが出来ます。
記述例
RedirectMatch (.*)\.gif$ http://www.anotherserver.com$1.jpg

詳細は、Apache RedirectMatchディレクティブを参照。 既存サイトのURLを変更する方法は、URLの変更を伴うサイト移転の例を参照。


.htaccessが使えない場合

また、利用している環境で、.htaccessによるリダイレクトが使えない場合には、次の方法でリダイレクトする方法もあります。

mata refresh
<head>内で次のように記載することで、meta要素のhttp-equiv属性に”refresh"を設定すし、リダイレクトを指定できます。content属性で指定した秒数後に指定したURLへリダイレクトされます。
記述例
<meta http-equiv="refresh" content="秒数; URL=http://dest-domain/"
>

PHP header()関数

PHPを使って転送先にリダイレクトさせるには、header()関数Locationヘッダーを使用し、header()関数以下のスクリプトが実行されないようにexit()関数を使ってスクリプトを終了させます。

記述例
<?phpheader('HTTP/1.1 301 Moved Permanently');
header('Location: http://sample.co.jp/');
exit();
?>

 

mod_rewriteを使用したリダイレクト

サーバーの拡張機能mod_rewriteの機能を使用することができれば、RewriteRuleディレクティブを使ったリダイレクトを設定することができます。

記述例
RewriteEngine On
RewriteBase /
RewriteRule 転送元ファイル正規表現 転送先URL [フラグ]
RewriteEngine:mod_rewriteの機能のOn/Off を指定
デフォルトの値は、OffなのでURLの書き換え処理を行うには、Onにする

RewriteBase:RewriteRuleディレクティブで指定するリダイレクト先URLで書き換える基準となるディレクトリを相対パスで指定
RewriteRuleの転送先を相対パスで記述した場合にのみ適用され、絶対パスで指定している場合には不要で省略した場合は、.htaccessを配置したディレクトリからの相対パスが適用される

RewriteRule:具体的なURLの書き換えルールを記述
1番目のパラメータである正規表現にマッチした場合には、2番目のパラメータであるURLに書き換えられる

フラグ:省略可能、301リダイレクトにするには、R=301を指定する必要がある
合わせて指定される「L」はURLの書き換え処理を終了を意味する

例えば、特定のページから特定ページへのリダイレクトは、以下の記述例のように記述します。

記述例

RewriteEngine On
RewriteRule ^srce/(.*)$ http://www.sample.co.jp/dest/$1 [R=301,L]

IfModuleディレクティブ

次のように記述することで、使用している環境でmod_rewrite が利用できるかどうかを確認し、利用できない場合には、<IfModule mod_rewrite.c> ~ </IfModule>の中のコードが適用されません。
記述例
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ...
</IfModule>

 

構文
<IfModule [!]module-file|module-identifier> ... </IfModule>
IfModuleディレクティブは、モジュールが存在する場合または存在しない場合に処理されるディレクティブを指定することができ、モジュールが存在しない条件の場合には、!をモジュールのファイル名の前に付けることで、そのモジュールが存在しない場合に処理されます。

module引数は、モジュール識別子または、コンパイルをした時のモジュールのファイル名で、rewrite_moduleは識別子でmod_rewrite.cはファイル名です。

mod_rewriteが利用できない環境ではmod_ rewriteのコードを記述するとエラーが発生します。利用できるかわらない場合、IfModuleディレクティブを使いmod_rewriteが使えるかを確認できます。

利用できることがわかっている場合には不要で、Apacheのマニュアルの<IfModule> ディレクティブには、「特定のモジュールの存在に関わらず動作する設定ファイルの原本が必要な場合にのみ、このセクションを使用してください。通常の動作では、ディレクティブを<IfModule>セクションの中に入れる必要はない。」ということが記載されています。

RewriteCond ディレクティブ
RewriteCond ディレクティブは、書き換えルールを実行するための条件を定義します。RewriteCondに記述した条件を満たした場合にのみ、直後のRewriteRuleディレクティブの書き換えが行われ、条件を満たさない場合には、直後のRewriteRuleディレクティブは実行されません。

RewriteCondディレクティブは、RewriteRuleディレクティブの前に1つ以上設置することができます。複数設置する場合は、オプションによってOR条件として処理するかを指定できます。オプションを省略した場合には、AND条件として処理されます。
構文
RewriteEngine On
RewriteCond 文字列 条件パターン [オプション]
RewriteRule 条件 置換文字列

オプション
RewriteCondで使用できるオプション

オプション  意味
[OR]    連続する RewriteCond のいずれかが true の場合に実行します。
       省略時は、AND条件として処理され、連続するRewriteCondが
       全てtrueの場合に実行します。
[NC]      条件を評価する時、大文字小文字を区別しません。
       指定しないと大文字小文字を区別します。
ORとNCをどちらも指定したい場合は[OR,NC]とカンマ区切りで指定します。

後方参照
RewriteCondの条件パターンでは、正規表現で括弧を使って一致した値は、変数を使って再利用できます。RewriteCondで指定したパターンを参照する場合には、%nを使い、括弧が複数ある場合には、左から%1、%2というように指定します。

RewriteRuleディレクティブでも後方参照を利用できます。RewriteRuleディレクティブの場合は、通常の正規表現の後方参照と同様に$nを使用します。

環境変数
mod_rewriteでは、環境変数という特別な変数を利用でき、%{環境変数名}と指定することで利用できます。

環境変数         値と意味
HTTP_HOST       リクエスト先のDNS名の情報。
HTTP_REFERER      参照元のURL情報
HTTP_ACCEPT        ブラウザがサポートするメディア、MIMEタイプの情報
HTTP_USER_AGENT  ユーザのブラウザや端末情報
HTTPS          HTTPSであればon、そうでなければoffが返却される
QUERY_STRING    クエリ文字列
SERVER_ADDR     サーバーのアドレス
SERVER_PORT           サーバーのポート番号
PATH_INFO      ファイル名とクエリ文字列の間にあるパス情報
REMOTE_ADDR    ユーザのIPアドレス情報
REMOTE_USER    リモートユーザー名
REMOTE_HOST    リモートホスト名
THE_REQUEST    リクエスト文字列
REQUEST_URI     リクエストされたURIの情報とクエリ文字列
REQUEST_FILENAME リクエストされたファイル名(絶対パス)
SCRIPT_FILENAME  実行するスクリプトの絶対パス情報
DOCUMENT_ROOT  ドキュメントルートのパス情報
TIME_YEAR       年
TIME_MON      月
TIME_DAY       日
TIME_WDAY      曜日(0:日~6:土)
ENV:環境変数名    %{ENV:...}式を指定し環境変数に基き条件分岐可能

 

条件パターンで使用できる演算子
RewriteCondでは、条件に一致するパターンをPerl互換の正規表現で指定することができます。下記の記述例は、リクエストされたファイルもリクエストされたディレクトリも存在しないという条件になります。
記述例
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

利用できる
演算子の例   意味
!      否定
<       テスト文字列より大きい場合はtrue
>       テスト文字列より小さい場合はtrue
=       テスト文字列と等しい場合はtrue
<=       テスト文字列以上の場合はtrue
>=       テスト文字列以下の場合はtrue
-d         ディレクトリが存在する場合はtrue
-f        ファイルが存在する場合はtrue
-s        ファイルが存在し、サイズが0でない場合はtrue

RewriteRuleディレクティブ
RewriteRuleディレクティブは、URLの書き換えを行うディレクティブで、条件パターンに一致するURLを、その後の置換文字列で書き換えます。条件パターンは、Perl互換の正規表現で指定することができます。
構文
RewriteRule 条件パターン 置換文字列 [フラグ]
条件パターン :URLとマッチさせる部分
        正規表現を利用することができる
置換文字列  :URLと条件パターンがマッチした場合に、行う処理を指定する
[フラグ]   :挙動を制御するためのオプションを指定できる
        複数のフラグを指定する場合には、カンマ区切りで指定する
フラグ    別名    意味
R           redirect        指定したURLにリダイレクトする
[=code]           [R=301]のようにレスポンスコードを指定する
             ことができる
             指定しない場合は、302 Moved Temporarilyで
             リダイレクトされる
             temp(302)、permanent(301)、seeoth
             er(303)のシンボル名も指定できる
F     forbidden        ステータスコード 403 Forbiddenを返す
             RewtiteCondに設定した条件で、Webサーバー
                                  へのアクセスを禁止する場合などに指定する
G     gone          ステータスコード 410 Goneを返す
             ユーザーに、存在しないページにアクセスして
                                  いることを通知する時に指定する
P      proxy         ルールにマッチしている場合には、書き換えた
             URLをプロキシ要求とみなし、リバースプロキ
             シとして動作する
             このフラグを使用する場合には、mod_proxy
             が組み込まれている必要がある
L     last         ルールにマッチしている場合は、URLの書き
             換え処理を終了し後続のルールを適用しない
             但し、.htaccessでは、Lフラグが有効になら
                                   ない
N     next          一連の書き換え処理のルールを先頭のルール
                                   から再度実行する
              既に書き換えられたURLが対象となる
              本フラグを指定する場合は、書き換え処理が
                                    無限に実行されないよう適切に終了条件を設
               定する必要がある
C      chain           ルールにマッチしている場合は、後続のルー
                                    ルを適用する
               ルールにマッチしていない場合、後続のルー
                                    ルは全て適用されない
T=MIME-  type=MIME-   ルールにマッチしている場合は、指定した
type         type               MIMEタイプをContent-Typeヘッダに設定
                                    する
NS           nosubreq        Webサーバー内で発生するサブリクエスト
                                    には、ルールを適用しない
             ユーザーから末尾がスラッシュのURLが指
                                    定された際に、DirectoryIndexディレクテ
                                    ィブで指定したファイルに対するサブリク
                                    エストが発生するが、そのサブリクエスト
                                    にルールを適用しない場合などに使用する
NC      nocase        大文字小文字を区別せずにルールを適用
                                    する
QSA    qsappend      書き換え前のURL及び置換文字列にそれぞ
                                    れクエリ文字列が存在する場合には、置換
                                    文字列の末尾にアンパサンドと書き換え前
                                    のURLに指定されたクエリ文字列を追加す
                                    る
             本フラグを指定しない場合には、クエリ文
                                    字列は置換文字列で上書きされる
NE     noescape      書き換え時のURLエスケープを抑制する
             通常、パーセント(%)やセミコロン(;)など
                                    の特殊文字は、16進表現の“%25”、“%3b”
                                    にエスケープされるが本フラグを指定した場
             合には、エスケープされない
PT     passthrough  URLの書き換え後、他のモジュールに制御を
                                    渡す書き換えたURLに対し、Aliasディレクテ
                                    ィブ、ScriptAliasディレクティブおよびRed
                                    irectディレクティブなどを使用する場合に指
                                    定する
S=num    skip=num     ルールにマッチしている場合、数値に指定し
                                    た数の後続のルールの適用をスキップする
E=環境   env=環境      ルールにマッチしている場合、指定した任意
変数:値       変数:値       の環境変数に設定する
             値には、置換文字列と同様に、$nおよび%n
             も指定できる

RewriteRuleを複数記述する場合
RewriteRuleを複数記述した場合、処理は先頭行から条件に一致する行を探索する。条件に一致した場合は、先頭行に戻り、再度条件に一致する行を探索する。

.htaccessファイルでURLの書き換えを行うと、書き換えが終わった後にもう一度書き換え設定を上から順に適用し、書き換えの必要がないかをチェックし、書き換える必要が無くなるかループでエラーになるまで処理が続行されます。
.htaccessでは、再探索が優先されるので、無限ループを防ぐには、通常RewriteCondを使用します。

index.htmlなしに統一する場合
インデックスファイルにアクセスがあった場合に、/ディレクトリに301リダイレクトさせる方法です。
記述例
RewriteEngine On
RewriteCond %{THE_REQUEST} ^.*/index\.html
RewriteRule ^(.*)/index\.html$ http://%{HTTP_HOST}/$1 [R=301,L]
%{THE_REQUEST} には、HTTPリクエスト(例:GET /index.html HTTP/1.1)が入っていて、条件パターン ^.*/index\.html にマッチすれば、次の行のRewriteRuleが適用され、/index.htmlが削除されます。

サーバーの環境によっては、この設定を記述するとリダイレクトによりphpMyAdminにコントロールパネルからアクセスできなくなる場合があるらしいです。ユーザー名とパスワードを入力しても、エラーも表示されずにログイン画面のままとなるようです。

その場合には、phpMyAdminのディレクトリ(/mysqladmin/)を除外します。
記述例
RewriteEngine On
RewriteCond %{REQUEST_URI} !(^/mysqladmin/)
RewriteCond %{THE_REQUEST} ^.*/index\.(html|php)
RewriteRule ^(.*)index\.(html|php)$ http://%{HTTP_HOST}/$1 [R=301,L]

 

httpsに統一する場合
以下の記述例は、httpで始まるURLへのアクセスをhttpにリダイレクトさせる方法です。
記述例
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

httpに統一する場合
以下の記述例は、httpsで始まるURLへのアクセスをhttpにリダイレクトさせる方法です。
記述例
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

メンテナンスページにリダイレクトさせる場合
Webサイトのメンテンナスをしていて、どのURLにアクセスされても「メンテナンス中」というメンテナンスページ(mainte.html)を表示するようにしたい場合には、.htaccess に以下の記述例のように記述することでリダイレクトさせることが出来ます。
最終行に記載しているHeaderディレクティブでは、メンテナンス終了予定時刻を設定しています。
記述例
ErrorDocument 503 /mainte.html
RewriteEngine On
RewriteCond %{REQUEST_URI} !=/mainte.html
RewriteCond %{REMOTE_ADDRES} !=xxx.xxx.xxx.xxx
RewriteCond %{REQUEST_FILENAME} !\.(css|jpe?g|gif|png|js)$
RewriteRule ^.*$ - [R=503,L]
Header set Retry-After "Sun, 06 Jun 2021 9:00:00 GMT"

緊急メンテナンスなどの場合には、以下の記述例の記述を .htaccessに追記することで、ユーザーに「During emergency maintenance.」というメッセージを表示し、検索エンジンには503のステータスコードを返すことができます。
記述例
ErrorDocument 503 "During emergency maintenance."
RedirectMatch 503 .*

エラーページの変更方法
ErrorDocumentディレクティブを使うことによって、エラードキュメントの表示方法の設定をすることができます。
構文
ErrorDocument error-code document
error-codeには、ステータスコード。documentには、表示するテキストまたはファイルへのパスを指定することができます。

ErrorDocumentディレクティブを使うことによって、問題やエラーが発生した時に以下のような振る舞いを設定することができます。
  • 問題やエラー処理をするために、自サーバ内のURL-pathへリダイレクト
  • 問題やエラー処理をするために、外部URLへリダイレクト
  • 自分で指定したメッセージを表示
  • Apache標準のメッセージを表示

自分で指定したメッセージを表示したい場合は、以下の記述例のようにステータスコードの後に、ダブルクォートで囲みメッセージを記述します。
記述例
ErrorDocument 404 "File not found"
自サーバ内のURL-pathにリダイレクトして、問題やエラーの処理をするには、ドキュメントルートからの相対パスで指定します。
記述例
ErrorDocument 404 /file_not_found.html
外部URLへリダイレクトして、問題やエラーの処理をするには、httpなどで始まる完全な URLを指定します。
ただし、外部URLをErrorDocumentに指定することにより、ドキュメントがどこにあるかを通知するために、クライアントにはリダイレクトが送出されます。このため、クライアントは、404のステータスコードを受け取らず、リダイレクトのステータスコードを受け取ります。ステータスコードを使用して、有効なURLであるかどうかを判定しようとするウェブロボットやその他クライアントを混乱させる可能性がありますので注意が必要しましょう。

ErrorDocument 401に外部URLを指定した場合も、クライアントは401ステータスコードを受け取らないため、ユーザーにパスワード入力を要求しなければならないことがわからなくなりるので、ErrorDocument 401を使う場合には、内部サーバーのドキュメントを参照するようにしましょう。

ErrorDocument 404の場合も、同様に内部サーバーのドキュメントを参照するようにして、ユーザーやクローラーにWebサーバーから404のステータスコードを返し、変更した404ページが、検索エンジンのインデックスに登録されないようにしましょう。
ステータスコードの抜粋
ステータス  概要        詳細
コード
 401    Unauthorized    ユーザー認証に失敗
                ID、パスワードのタイプミスなど
 403    Forbidden      指定されたリソースへのアクセス権なし
                 許可されないディレクトリなどへのアクセス
 404    Not Found      指定されたリソースが存在しない
                URLタイプミスなど
 500    Internal Server   サーバーがリクエストを実行できない
      Error        .htaccessなどのサーバ設定ファイルの
                記述ミスなど
 501    Not Implemented   サーバーにリクエストを処理する機能がない
 503    Service Unavailable サービスが利用できない

2020/07/05

Apache ~ .htaccess設定方法と使い方 多言語対応~

.htaccessファイルは、分散設定ファイルとも呼ばれ、Webサーバーの挙動を設定することができるファイルのひとつで、WebサーバーとしてApacheが使用されていて、管理者が.htaccessファイルの設置を許可していれば使用することができます。

設定方法


Apacheは、http.confにディレクティブという命令を記述することで設定しますが、http.confは管理者にしか編集できなくなっています。それに対して、.htaccessファイルは各ユーザーがディレクトリ単位に設定することができます。ファイルの構文は、主設定ファイルのhttp.confファイルと同じです。
注意事項
  • 基本的に、http.confファイルにアクセスできない場合以外は極力使用しない
  • FTPで転送する場合、ASCIIモードまたは、テキストモードを使用する
  • Windowsで編集する場合、一旦htaccess.txtなどに置き換え、サーバーに配置後にリネームする
  • 設置されたディレクトリと配下ディレクトリ全てに影響する
  • 構文誤りや管理者が許可していないディレクティブを使用した場合、該当ディレクトリ配下のファイルアクセスが、500 Internal Server Errorになる
  • 最終行には、改行を入れる

使い方

いろんな使い方ができるみたいですが。ざっくりとですが、こんなことができるみたいです。勉強しながら少しずつ記事にしていきたいと思っています。

使い方概要
  • セキュリティ関連
  • エラーページ制御
  • キャッシュ制御
  • ページ表示の高速化
  • 多言語対応
今回は、多言語対応について記事を書きます。
多言語対応
・MultiViews
HTML/1.1では、ユーザーエージェントのヘッダに含まれるメタデーター(メディアタイプ、言語、文字セット、エンコーディングなどの優先傾向に基づいて)を判別し、複数のリソースの中から最適なものを選択するためのコンテント・ネゴシエーションという仕組みが定められています。例えば、ユーザーエージェントから送信されるAccept-Languageヘッダ値にenが優先されていれば英語版のファイルをjaが優先されていれば日本語版のファイルが送信されるようになります。
ただし、言語の数が多かったりディレクトリ内にファイルやリソースが多く存在する場合などには、適切な言語を探し出すのに時間がかかることがあり、そのような場合には、MultiViewsの代わりにtype-mapハンドラを使用する方が良いそうです。
詳細は、Apacheコンテントネゴシエーションを参照して下さい。

MultiViews
Apacheには、コンテントネゴシエーションを簡単に利用できるようMultiViewsという機能が用意されています。MultiViewsはディレクトリ毎のオプションで、httpd.confや.htaccessでOptionsディレクティブによって設定することができます。Options Allが指定されていても、MultiViews機能は有効にならないので明示的に指定する必要が有ります。

MultiViews機能を有効にするには次のように記述します。
記述例
Options +MultiViews
日本語と英語の2か国語を利用する場合には、次のように記述し言語コードと拡張子を関連付けします。
記述例
AddLanguage en .en
AddLanguage ja .ja
この設定で、.jaという拡張子のファイルは日本語、.enという拡張子のファイルはファイルは英語に関連付けされます。
そして、サーバー上に日本語版と英語版のファイルにそれぞれの拡張子を付けたファイル名で格納します。
index.html.en
index.html.ja
AddLanguageディレクティブ
拡張子に指定された言語を関連付けします。
AddLanguagディレクティブの詳細はこちらを参照。
構文
AddLanguage MIME-lang extention [extention] ...
MIME-langは、拡張子を含んだファイルのMIMEにおける言語で、新たな関連付けは既存の関連付けに追加され同じ拡張子の関連付けは上書きされます。引数のextentionは、大文字小文字の区別をせず最初のドットは省略できます。複数の言語が同じ拡張子に割り当てられている場合には、最後に定義されているものが有効になります。

デフォルトの言語ファイル設定
設定した言語がユーザーのブラウザの言語設定にない場合、コンテントネゴシエーションをサポートしていない場合に、NOT ACCEPT(HTTP406)エラーにならないようにするためデフォルトの言語を設定します。

LanguagePriorityディレクティブ
MultiViewsリクエストを使用する時にクライアントが言語の優先順位を提供していない場合に言語の優先順位を設定します。
構文
LanguagePriority MIME-lang [MIME-lang] ...
言語キーワードを優先順位の高い順に記述します。このディレクティブは、ForceLanguagePriorityディレクティブが、None以外の場合にのみ有効になります。

ForceLanguagePriorityディレクティブ
リクエストに合うドキュメントをひとつだけ返すことができない場合に、LanguagePriorityディレクティブを使ってネゴシエーション結果を返します。
構文
ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback] ...
       None    :ForceLanguagePriorityディレクティブの機能を無効にする
       Prefer   :同様の選択肢がいくつも存在する時にMULTIPLECHOICES(HTTP300) 
                     を返却する代わりに、LanguagePriorityを使ってひとつだけドキュメント
                     を返すようにする
                     ユーザーのAccept-Languageヘッダの言語の優先順位が同じ場合は、
                     LanguagePriorityの中の最初に一致する言語のコンテンツを返却する
       Fallback:ユーザーのAccept-Languageヘッダに指定された言語のコンテンツが
                     存在しない場合は、NOT ACCEPT(HTTP406)を返却する代わりに
                     LanguagePriorityの中の最初に一致する言語のコンテンツを返却する

PreferとFallbackの両方のオプションを同時に指定すると、複数の候補が存在する場合にLanguagePriorityの最初の候補が返却され、クライアントの許容する言語に合う候補が存在しない時には存在するドキュメントで最初のものが返却されます。

2020/06/21

Apache ~ .htaccess設定方法と使い方 ページ表示の高速化~

.htaccessファイルは、分散設定ファイルとも呼ばれ、Webサーバーの挙動を設定することができるファイルのひとつで、WebサーバーとしてApacheが使用されていて、管理者が.htaccessファイルの設置を許可していれば使用することができます。

設定方法


Apacheは、http.confにディレクティブという命令を記述することで設定しますが、http.confは管理者にしか編集できなくなっています。それに対して、.htaccessファイルは各ユーザーがディレクトリ単位に設定することができます。ファイルの構文は、主設定ファイルのhttp.confファイルと同じです。
注意事項
  • 基本的に、http.confファイルにアクセスできない場合以外は極力使用しない
  • FTPで転送する場合、ASCIIモードまたは、テキストモードを使用する
  • Windowsで編集する場合、一旦htaccess.txtなどに置き換え、サーバーに配置後にリネームする
  • 設置されたディレクトリと配下ディレクトリ全てに影響する
  • 構文誤りや管理者が許可していないディレクティブを使用した場合、該当ディレクトリ配下のファイルアクセスが、500 Internal Server Errorになる
  • 最終行には、改行を入れる

使い方

いろんな使い方ができるみたいですが。ざっくりとですが、こんなことができるみたいです。勉強しながら少しずつ記事にしていきたいと思っています。

使い方概要
  • セキュリティ関連
  • エラーページ制御
  • キャッシュ制御
  • ページ表示の高速化
  • 多言語対応
今回は、ページ表示の高速化について記事を書きます。
ページ表示の高速化
  • ファイルを自分で圧縮する方法
  • ファイルをサーバーで圧縮する方法

gzipというデータ圧縮プログラムを使ってファイルサイズを小さくすることで、Webサーバーとブラウザ間の通信データ量を減らして、ページの表示をより高速にすることができるそうです。gzipで対象とするのは、HTML,CSS,JavaScriptなどのテキストファイルで、画像やpdfなどの圧縮済みファイルをgzipしても効果はなく、ファイルサイズが増えてしまい逆効果になる場合もありあます。

ファイルを自分で圧縮する方法
更新頻度の少ない静的なWebページのファイル(HTML、CSS、JavaScript)に向いている方法なんです。いっぽうで、PHPなどで動的にWebページのファイルが生成される場合には、事前にファイルをgzipで圧縮できないのでファイルをサーバーで圧縮する方法を使います。その場合には、gzipに対応していないブラウザを考慮して非圧縮のファイル(style.cssなど)と圧縮済みのファイル(style.css.gzなど)の2種類のファイルをサーバーに準備します。

gzipファイルの作成方法
gzip圧縮をするには、専用のアプリケーション(例:Windowsの7zip、lhaplus)を使用するか、HTML、CSS、JavaScriptを使用するならOnline JavaScript/CSS/HTML Compressorを利用することもできます。

ファイルを圧縮してできる、拡張子が.gzのファイルをサーバーにアップロードします。
link要素やscript要素の記述には、gzip圧縮していないファイルを指定し、ファイル読み込みのHTMLタグの記述を変更する必要はないです。
記述例
<link rel="stylesheet" herf="css/style.css"> 
<script type="text/javascript" src="js/core.js"> </script>
.htaccessの記述追加
作成したgzipファイルの転送を有効にするためには、.htaccessに記述を追加します。gzip圧縮対応のブラウザにはgzipファイルを転送し、対応していないブラウザには圧縮されていないファイルを転送する設定をします。
記述例
RewriteEngine On
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME} !\.gz$
RewriteCond %{REQUEST_FILENAME} \.gz -s
RewriteCond %{REQUEST_FILENAME} (\.js|\.css|\.html)$
RewriteRule .+ %{REQUEST_URI} .gz [L]

<FileMatch "\.html\.gz$">
    ForceType text/html
    AddEncoding x-gzip .gz
</FileMatch>

<FileMatch "\.css\.gz$">
    ForceType text/css
    AddEncoding x-gzip .gz
</FileMatch>

<FileMatch "\.js\.gz$">
    ForceType application/x-javascript
    AddEncoding x-gzip .gz
</FileMatch>
 
RewriteEngine On
mod_rewrite機能のOn/Offを指定する。URL書き換え処理を行う場合にはOnにする。

RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCondで、gzipが許容されていれば...という条件を設定する。

RewriteCond %{REQUEST_FILENAME} !\.gz$
リクエストされたファイルの拡張子が.gzでなければ...という条件を設定する。

RewriteCond %{REQUEST_FILENAME} \.gz -s
ファイルの末尾に.gzを付与したファイルが存在すれば...という条件を設定する。

RewriteCond %{REQUEST_FILENAME} (\.js|\.css|\.html)$
ファイルの拡張子が.jsまたは、.cssまたは、.htmlの場合には...という条件を設定する。

RewriteRule .+ %{REQUEST_URI} .gz [L]
RewriteRuleで、上記全ての条件を満たす場合には...リクエストされたURIの末尾に.gzを追加する。

<FileMatch "\.html\.gz$">~</FileMatch>など
FileMatchを使い拡張子が一致するファイル毎にMIME-TYPEとgzエンコードを指定する。

ForceTypeディレクティブは、一致するファイルが指定のMIMEコンテントタイプで送信されるように設定する。

AddEncodingディレクティブは、与えられた拡張子で指定されたエンコーディングに関連付けをする。AddEncoding x-gzip .gzは拡張子.gzを含むファイルがx-gzipエンコーディングでエンコードされるという設定。

gzip圧縮されたファイルで通信されていることの確認方法
レスポンスヘッダーのContent-Encodingがgzipになっていることで、gzip圧縮されたファイルで通信nされていることが確認できます。

圧縮ファイルをサポートするブラウザの場合には、HTTPリクエストにAccept-Encoding:gzip,deflateを付加してgzip圧縮やDeflate圧縮を受け付けできることをサーバーに通知し、これを受信したサーバーが圧縮ファイルを返却できる場合には、Content-Encoding:gzipを付加したHTTPレスポンス、圧縮ファイルを返却します。

ファイルをサーバーで圧縮する方法
mod_deflateを利用する方法
mod_deflateを利用することで、サーバーが自動でgzip圧縮をするようになりますがリクエストがある度にサーバーが圧縮を行うので、CPUやメモリーを消費します。レンタルサーバーによっては、この機能をサポートしていない場合もあるそうなので、利用する場合には、利用中のサーバーがmod_deflateをサポートしていることを確認する必要が有ります。
mod_deflateモジュールがサポートされているかを調べられるサイトもあるそうです。

特定のMIMEタイプのみ圧縮したい場合には、AddOutputFilterByTypeディレクティブで設定することができます。text、xml、html、css、JavaScriptを圧縮して転送するには.htaccessに次のように設定します。ただし、mod_deflateが既に有効な場合には、IfModuleディレクティブは不要です。

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/text text/xml text/html text/css text/plain application/x-javascript application/javascript
</IfModule>
 
mod_filterを利用する方法
mod_filterを利用することで、xml、html、css、JavaScript、jsonなどのファイルを圧縮することができます。ApacheのバージョンによってFilterProviderの構文が異なります。2.4.4以降のバージョンを利用する場合には構文を確認して下さい。
<IfModule filter_module>
    FilterDeclare   COMPRESS
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/html
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/css
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/plain
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/x-component
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/javascript
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/json
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/xhtml+xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/rss+xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/atom+xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/vnd.ms-fontobject
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $image/svg+xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/x-font-ttf
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $font/opentype
    FilterChain     COMPRESS
    FilterProtocol  COMPRESS  DEFLATE change=yes;byteranges=no
</IfModule>
 
FilterDeclareディレクティブには、出力するフィルタを設定する。

FilterProvider、FilterChain、FilterProtocolディレクティブには、使用するフィルタ名を設定する。

FilterProviderディレクティブには、スマートフィルタのプロバイダを登録する。
2.4.4以降のバージョンそれより前のバージョンで構文が異なるので構文を確認して下さい。

2020/03/01

Blogger テーマ ~厳選テーマ 2020~

たくさんあるBloggerのテーマ、あれもいいな...これもいいなって、やっぱり目移りしてしまいますよね。気になるテーマが増えたので、「Blogger テーマ ~初めてのテンプレート選び」で紹介させていただいた、初めてテーマを選ぶ時のポイントとカスタマイズする時のテーマ選びのポイントをもとに、使ってみたいと想う5つのテーマを選び直しました。

1.Gossip

前回同様、かわいい見た目と、かっこいいデザイン、シンプルで、記事が見やすいなど、良いところは多いのですが、日本語でないことで今回も最後まで悩んだテーマです。リンク先で、ライブプレビューを見たり、ダウンロードできますので、実際に見て触ってみてはどうでしょうか。

2.Simplify2
かっこいいデザイン、シンプルで、記事が見やすくってなどは良いのですが、やっぱり日本語でないことで最後まで悩んだテーマです。記事上のメニューと記事下のページ数とタイトル付きの前の記事/後の記事ナビゲーションができるということから、今回も最終的に使うことに決めたテーマです。リンク先で、ライブプレビューを見たり、ダウンロードできますので、実際に見て触ってみてはどうでしょうか。

3.QooQ
日本語のテーマです。テーマTokyo、Kyotoと同じ作者のラムネグさんが、これまでのまとめとして作ったという、スマートでカッコいいデザインのテーマ。表示の速さにもこだわって、シンプルで軽量に設計したそうです。SEO対策されています。リンク先には、作者ラムネグさんの詳細な説明。トップページとかカテゴリページとかの記事一覧をリストにしたバージョンと普通のバージョンのサンプルページを見たり、ダウンロードできたりしますので、実際に見て触ってみてはどうでしょうか。そうそう、WordPress版のQooQもあるそうですよ。

4.Tokyo 

日本語のテーマです。テーマKyoto、QooQと同じ作者のラムネグさん作のシンプルで、かっこいいだけでなく、SEO対策されていたり、スクロールに合わせてサイドバーがついてきたりする機能も付いている実現力派なテーマです。こちらも、リンク先には、詳細な説明。そして、サンプルページを見たり、ダウンロードできたりしますので、実際に見て触ってみてはどうでしょうか。

5.Vaster2

日本語のテーマです。最低限の機能でシンプルに設計されているだけでなく、表示速度が速かったり、日本語対応のテンプレートデザイナーが付いていたり、人気記事や関連記事を表示する機能も付いている実現力派なテーマです。こちらも、リンク先には、作者トーマスさんによる詳細な説明。そして、サンプルブログを見たり、ダウンロードできたりしますので、実際に見て触ってみてはどうでしょうか。日本語で、表示速度が速くて、必要な機能が付いているということで、最終的に使うことに決めたテーマです。
前回も書きましたが、見た目だけでなく、操作性や表示速度、SEOなど、テーマ選びって本当に悩ましいです。選ぶだけでこんなに悩んでしまうのだから、作る人達は、もっと悩んでいるんじゃないかと想うと…使わせて頂いて、本当に感謝です。

2019/11/24

Apache ~ .htaccess設定方法と使い方 キャッシュ制御~

.htaccessファイルは、分散設定ファイルとも呼ばれ、Webサーバーの挙動を設定することができるファイルのひとつで、WebサーバーとしてApacheが使用されていて、管理者が.htaccessファイルの設置を許可していれば使用することができます。

設定方法


Apacheは、http.confにディレクティブという命令を記述することで設定しますが、http.confは管理者にしか編集できなくなっています。それに対して、.htaccessファイルは各ユーザーがディレクトリ単位に設定することができます。ファイルの構文は、主設定ファイルのhttp.confファイルと同じです。
注意事項
  • 基本的に、http.confファイルにアクセスできない場合以外は極力使用しない
  • FTPで転送する場合、ASCIIモードまたは、テキストモードを使用する
  • Windowsで編集する場合、一旦htaccess.txtなどに置き換え、サーバーに配置後にリネームする
  • 設置されたディレクトリと配下ディレクトリ全てに影響する
  • 構文誤りや管理者が許可していないディレクティブを使用した場合、該当ディレクトリ配下のファイルアクセスが、500 Internal Server Errorになる
  • 最終行には、改行を入れる

使い方

いろんな使い方ができるみたいですが。ざっくりとですが、こんなことができるみたいです。勉強しながら少しずつ記事にしていきたいと思っています。

使い方概要
  • セキュリティ関連
  • エラーページ制御
  • キャッシュ制御
  • ページ表示の高速化
  • 多言語対応
今回は、キャッシュ制御について記事を書きます。
キャッシュ制御
  • mod_expiresモジュール
  • FileETagディレクティブ

Webページの表示速度を向上させる方法のひとつとして、ブラウザのキャッシュ制御があります。キャッシュを制御することで、応答時間の短縮やサーバーリソースが節約出来たりします。PageSpeed Insightsブラウザのキャッシュを活用する方法が記載されていますので参考にして下さい。

mod_expiresモジュール
このモジュールで、サーバーの応答のExpiresヘッダとCache-Controlヘッダのmax-ageディレクティブの設定を制御することができます。元のファイルが作成された時刻もしくは、クライアントのアクセス時刻のどちらかに基づいて有効期限を設定することができます。

Expiresヘッダの設定
記述例
<ifModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access time plus 10 minutes"
  ExpiresByType text/html "access time plus 10 seconds"
  ExpiresByType image/jpg "access time plus 7 days"
                        ...
  ExpiresByType text/css "access time plus 1 month"
                        ...
</ifModule>
ExpiresActiveディレクティブ
ExpiresとCache-Controlヘッダを有効にするか無効にするかを決めます。Offに設定された場合には、ヘッダは生成されません。Onに設定された場合には、ヘッダはExpiresByTypeディレクティブとExpiresDefaultディレクティブの基準に従い文書にヘッダを追加します。ExpiresとCache-Controlヘッダの存在を保証する訳でなく、基準が満たされない場合にはヘッダは追加されません。

ExpiresDefaultディレクティブ
全てのドキュメントに対して、デフォルトの有効期限を設定できます。また、ExpiresByTypeディレクティブを使うことでタイプ毎に上書きすることができます。
構文
ExpiresDefault <code>seconds
<code> :基準時刻をファイルの最終修正時刻(M)にするか、クライアントのアクセス時間(A)にするかを指定
second  :有効期限の日時を設定するための基準時刻に追加する秒数を設定
             ExpiresActive On
             ExpiresDefault A2592000
FilesMatchディレクティブを使用することで拡張子を指定することができます。
<FilesMatch "\.(jpg|png|js|css|)(\.gz)?$">
  ExpiresDefault A2592000
</FilesMatch>

ExpiresByTypeディレクティブ
指定したタイプのドキュメントに対して生成されるExpiresヘッダとCache-Controlヘッダのmax-ageディレクティブの値を定義できます。
構文
ExpiresByType MIME-type <code>seconds
MIME-type:キャッシュしたいファイルの種類を指定
<code> :基準時刻をファイルの最終修正時刻(M)にするか、クライアントのアクセス時間(A)にするかを指定
second:有効期限の日時を設定するための基準時刻に追加する秒数を設定
Cache-Control:max-ageは期限切れの時刻からリクエスト時刻を引いた秒数で設定する。
ExpiresActive On
#pngファイルはアクセス日時から1ヶ月間有効
ExpiresByType image/gif A2592000
#HTMLファイルは最終更新日時から1週間有効
ExpiresByType text/html M604600

代替期間指定構文
ExpiresDefaultディレクティブとExpiresByTypeディレクティブは、下記の構文で定義できます。
構文
ExpiresDefault "<base> [plus] {<num> <type>}*"
ExpiresByType type/encoding "<base> [plus] {<num> <type>}*"
base
 access:基準時刻をクライアントのドキュメントへのアクセス時刻にする
 now:'access’と同じ
 modification:基準時刻をファイルの最終更新時刻にする
plus
 plusキーワードは省略可能
num
 整数値
Type
 years
 months
 weeks
 days
 hours
 minutes
 seconds

Cache-Controlヘッダ 
Cache-Controlヘッダのmax-ageディレクティブを使いリソースの有効期限を設定することもできます。Headerディレクティブの引数にsetを指定することで応答ヘッダを設定します。Apacheモジュールmod_headers参照。
引数に空白文字が含まれている場合には、引数をダブルクォーテーションで囲む必要があります。
Header set header [value]
Cache-Controlヘッダは、HTTP/1.1仕様の1部として定義され、レスポンス、キャッシュ、ポリシーの設定に使用されていたヘッダーよりも優先されます。古いブラウザの中には対応しないものも存在します。
Cache-ControlとExpiresの両方を記述した場合には、Cache-Controlの設定が優先されます。
ExpiresActive On
Header set Connection keep-alive
<FilesMatch "\.(jpg|jpeg|png)$">
  Header set Cache-Control "max-age=2592000,public"
</FilesMatch>
<FilesMatch "\.(js|css)$">
  Header set Cache-Control "max-age=1209600,private"
</FilesMatch>
<FilesMatch "\.(html)$">
  Header set Cache-Control "max-age=600,must-revalidate"
</FilesMatch> 
public:どのキャッシュでもレスポンスを保存することを示す
private:レスポンスが1人のユーザーのものであり、キャッシュを共有保存しないことを示し、ブラウザのプライベートキャッシュはレスポンスを保存できます
must-revalidate:キャッシュに記録されているコンテンツが有効か否かをWebサーバーに必ず問い合わせます
no-cache:キャッシュしたものが有効か否かサーバーでの確認なしにキャッシュを利用しない
no-store:キャッシュしない

キャッシュを解除する方法
キャッシュの設定を行うと、有効期間内はブラウザのキャッシュを読み込むようになり、JavaScriptやCSSファイルを更新しても反映されないということが起こります。

クエリ文字列を付加する
キャッシュを有効にしながら、新しいファイルを強制的に読み込ませる方法の1つは、?で始まる適当なクエリ文字列をファイル名の末尾に加えます。こうすることで、ブラウザはそのクエリ付きのURLをまだ取得出来ていないファイルと認識して、キャッシュを読み込まずにサーバーからファイルを取得します。
<link rel="stylesheet" href="../css/style.css?20191124" type="text/css">
<script type="text/javascript" src="../js/base.js?date=20191124"></script>
<img src="image/gazou.jpg?20191124" alt="">
通常クエリ文字列を加える場合は、“?”の後に“name=value”の形式で付与しますが、キャッシュを解除する場合には、“name=value”の形式にする必要はありません。
PHPの場合には、filemtime()(../php/php_basic_04.php#filemtime)を使用すると便利です。
<?php
echo '<link rel="stylesheet" href="../css/style.css?' . filemtime('../css/style.css') . '">';
?>

URLを変更する
URLを変更するとブラウザはキャッシュは読み込まずにリソースを強制的に再取得します。実際のURLを変更するのではなく、HTMLの読み込み側のURLを変更します。例えば、style.cssをstyle.3210.cssに変更します。
<link rel="stylesheet" href="css/style.3210.css">
あわせて、.htaccessに下記のように“ファイル名.数値.拡張子”を“ファイル名.拡張子”にする修正を加えることで正しいcssファイルを読み込むようにする必要があります。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)\.(\d+)\.(js|css|png|jpg|gif)$ $1.$3 [L] 

キャッシュさせない
Apacheからブラウザに強制的にキャッシュさせないようにするには、How To Prevent HTTP File Caching With .htaccessを参考に.htaccessを修正します。

FileETagディレクティブ
ETagは、サーバー上に存在するファイルとブラウザのキャッシュ内のファイルが一致するを判断するためのタグのことで、ブラウザからIf-None-Matchタグにこの値が付けられ、サーバー側でこの値とETagの値が異なればレスポンスコード200(OK)でコンテンツが送信され、同一なら304(変更なし)として処理されキャッシュを使用することでキャッシュの効率化、回線の帯域の節約ができます。

FileETagディレクティブは、ETag応答ヘッダフィールドを作成する時に使用するファイルの属性を設定します。詳細は、Apache コア機能 FileETag ディレクティブを参照して下さい。

負荷分散のためにWebサーバーが複数台ある場合には、ファイルが同一でもinodeがサーバー毎に異なるため200を返す可能性があり、inodeを使わないようにしたり、検証をしないように設定したほうが良いこともあるそうです。詳しくは、ブラウザキャッシュでパフォーマンス向上―負荷分散装置の落とし穴に注意-を参照して下さい。

Headerディレクティブを使用して、ETag応答ヘッダを削除する方法は、Apache モジュール mod_headers Header ディレクティブを参考に下記のように記述します。
Header unset ETag
FileETag None

Apache1.3.23以降では、サーバー側でETagをつけないことでETag比較を行わなく出来るそうです。
 FileETag None 

2019/09/07

Apache ~ .htaccess設定方法と使い方 エラーページ制御~

.htaccessファイルは、分散設定ファイルとも呼ばれ、Webサーバーの挙動を設定することができるファイルのひとつで、WebサーバーとしてApacheが使用されていて、管理者が.htaccessファイルの設置を許可していれば使用することができます。

設定方法


Apacheは、http.confにディレクティブという命令を記述することで設定しますが、http.confは管理者にしか編集できなくなっています。それに対して、.htaccessファイルは各ユーザーがディレクトリ単位に設定することができます。ファイルの構文は、主設定ファイルのhttp.confファイルと同じです。
注意事項
  • 基本的に、http.confファイルにアクセスできない場合以外は極力使用しない
  • FTPで転送する場合、ASCIIモードまたは、テキストモードを使用する
  • Windowsで編集する場合、一旦htaccess.txtなどに置き換え、サーバーに配置後にリネームする
  • 設置されたディレクトリと配下ディレクトリ全てに影響する
  • 構文誤りや管理者が許可していないディレクティブを使用した場合、該当ディレクトリ配下のファイルアクセスが、500 Internal Server Errorになる
  • 最終行には、改行を入れる

使い方

いろんな使い方ができるみたいですが。ざっくりとですが、こんなことができるみたいです。勉強しながら少しずつ記事にしていきたいと思っています。

使い方概要
  • セキュリティ関連
  • エラーページ制御
  • キャッシュ制御
  • ページ表示の高速化
  • 多言語対応
今回は、エラーページ制御の使い方について記事を書きます。
エラーページ制御
  • エラーページの変更
エラーページの変更
ErrorDocumentディレクティブを使うことで、エラー発生時の表示方法を変更することができます。
  1. Apache標準のエラーメッセージを表示 
  2. 自分で作成したエラーメッセージを表示
  3. 自サーバー内のURL-pathへリダイレクトし、問題やエラーの処理
  4. 外部のURLへリダイレクトし、問題やエラーの処理
ErrorDocument error-code document
ErrorDocumentディレクティブは、HTTPのレスポンスコード、メッセージまたはURLを指定することで設定します。

1.Apache標準のエラーメッセージを表示
デフォルト設定なので、設定する必要はありませんが、”default”を設定することでApacheにハードコードされているメッセージを指定することができます。
ErrorDocument 404 /cgi-bin/err_urls.pl

<Directory /web/documents>
  ErrorDocument 404 default
</Directory>

2.自分で作成したエラーメッセージを表示
自分で作成したエラーメッセージを表示する場合は、documentに作成したメッセージをダブルクォートで括って指定します。
ErrorDocument 404 "Sorry, page not found."

3.自サーバー内のURL-pathへリダイレクトし、問題やエラーの処理
自サーバー内ので問題やエラーを処理する場合は、スラッシュで始まるドキュメントルートからの相対パスを指定します。
ErrorDocument 404 /page_not_found.html

4.外部のURLへリダイレクトし、問題やエラーの処理
httpなどで始まるURLを指定することで、外部URLで問題やエラーを処理することができます。
ErrorDocument 404 http://sample.exanple.com/cgi-bin/page_not_found
 

2019/06/08

ホームサーバー ~libcryptの古いバージョンへの依存~

ホームサーバーで、運用しているWordPressブログサイト、MataKitena BlogがFedora30へのアップグレードで、またまた起動できなくなったトラブル対応の続きです。今回も、またWebサーバーのapacheを起動させてみたら...何やらライブラリに存在しないものがあると、エラーメッセージを出力して異常終了していました。その解決策をここに残しておきます。

WordPressブログが起動できない原因は

今回も、WordPressブログがどうして起動できないのか調べて分かったことは、データベースであるMySQLは起動出来ているということ。そして、Webサーバーのapacheを起動させてみたら...何やらライブラリに存在しないものがあると、エラーメッセージを出力して異常終了しているようです。これで、原因がはっきりしました。libcrypt.so.1が存在しないので、Webサーバーが異常終了してしまいWordPressブログが起動出来ないのです。
出力されたエラーメッセージの一部
...error while loading shared libraries:libcrypt.so.1: cannot open shared object file: No such file or directory...

対応方法は...

今回の原因は、今使っているミドルウェアなどの中に、libcryptの古いバージョンに依存しているものが存在するためです。Fedora30には、このライブラリの更新されたバージョンが含まれていますが、とりあえずlibcryptの古いバージョンに依存したミドルウェアなどを実行させるために、パッケージをダウングレードさせることも可能ですが、他のミドルウェアなども不安定になってしまう可能性があるので、libcryptx-compatと呼ばれるパッケージをインストールすることにしました。
libcryptx-compatのインストール方法
sudo dnf install libxcrypt-compat 

2019/06/02

ホームサーバー 〜Fedora30 grubブートメニューが表示されない〜

Fedora29からFedora30へのアップグレード時、grubブートメニューが表示されずOSが起動出来なくなった件について対応が完了しましたので、記事に対処方法をまとめておきたいと思います。Fedora29へのアップグレード以降、トラブルが続いているホームサーバー、今回のアップグレードでも、またトラブルが発生しました。

トラブルの概要

Fedora29のアップデート完了後、Fedora30へのアップグレードを開始...ダウンロードが完了し、再起動後にインストールが始まるというメッセージを確認して、直ぐに再起動を実施しました。いつものgrubブートメニューが表示されて、アップグレードが完了と思っていたのですが。こんなメッセージと共に、grubプロンプトというものが表示されました。
    Minimal BASH-like line editing is supported. For the first word,
    TAB lists possible command completions. Anywhere else TAB lists
    possible device or file completions. ESC at any time exits.

grub>
この場合は、grubブートメニューを表示するためのGRUB2は正常に起動している状態で、モジュール や/ boot/grub/ディレクトリに格納されている他のモジュールをロードしたが、grub.cfgファイルが見つからなかったことを意味するそうです。他にも、grub rescueプロンプトというものを表示する場合もあるそうです。こちらの場合には、normal.mod が見つからなかったことを意味するそうで、どちらの場合も、ブートに関連するファイルが存在しないことを意味します。
参考までに、トラブル発生時、キーボードの認識がJISキーボードでなく、USキーボードになっていて思ったように文字入力ができない事象も発生していました。同じ事象の場合には、USキーボードの配列を参照しながら文字入力することで対処できます。

どんな対処方法があるの

大きくは、3通りほど存在するようです。1つは、OSのLiveDVDやLiveUSBから起動して環境を修復する方法。もう1つは、grubコマンドを使用して、応急処置を施しOSを起動。その後、恒久的な対処を実施する方法。そして最終手段、GRUB2のレスキューディスク(いくつか種類がありました。)を使って環境を修復する方法。今回は、この3通りのうち、grubコマンドを使用して、応急処置を施しOSを起動。その後、恒久対処を実施する方法でしか対処することができませんでしたので、こちらの方法を記事にしています。
他の2つの方法で対処することができなかったのは、USBブートがサポートされていない古いパソコンで、DVDRAMを搭載しているにも関わらず、CDは認識できるがDVDを認識できないという特殊な環境であるからです。

実際の対処は

インターネットで、たくさんの情報を参考にしましたがGRUBのバージョン、利用している環境(ディスク構成やUEFI、複数OSのマルチブートなど)で実行コマンドやパラメータを変える必要がありますので、本記事を参考にすることはできると思いますが、注意しながら、自分自身で判断して対処を実施して下さい。

まずは、lsコマンドでドライブの構成やパーティションなどを確認します。
最初は、ドライブの構成からです。
grub> ls
(hd0) (hd0,msdos2) (hd0,msdos1)

参考
hd0,1:sda1 hd1,0:sdb1
hd0,2:sda2 hd1,1:sdb2
gpt:Globally Unique Identifiers Partition Table
msdos:MS-DOS Master Boot Record
次に、パーティションの構成です。
最後にスラッシュをつけるのを忘れないように...
/bootパーティション。本来のgrub.cfgファイルの格納ディレクトリgrubとかgrub2を含んだパーティションを探します。
grub> ls (hd0,1)/
... grub2 ...
searchコマンドで検索する方法もあります。
バックアップを作成してりすると複数見つかる場合もあります...
grub> search --file /grub2/grub.cfg
hd0,msdos1
見つかりましたので、rootを設定します。
set root=(hd0,msdos1)
grub.cfgファイルを読み込みます。
自分で作成しておいたバックアップファイルを読み込ませたい場合には、バックアップファイルを指定することもできます。
configfile /grub2/grub.cfg
ドライブ上のGRUBからメニューが表示され、起動するOSを選択することで起動することができました...慌てないでください。まだ、恒久対処を実施していません。
恒久対処として、GRUBの修復を行います。
grub-installコマンドで指定するのは、パーティションでなく、ドライブのブートセクタなので注意してください。再起動したら、恒久対処の完了です。
# sudo update-grub
Generating grub configuration file ...
 ~
done
# grub-install /dev/sda
Installing for i386-pc platform...
 ~
Installation finished. No error reported.

2019/05/18

Apache ~ .htaccess設定方法と使い方 セキュリティ関連~

.htaccessファイルは、分散設定ファイルとも呼ばれ、Webサーバーの挙動を設定することができるファイルのひとつで、WebサーバーとしてApacheが使用されていて、管理者が.htaccessファイルの設置を許可していれば使用することができます。

設定方法


Apacheは、http.confにディレクティブという命令を記述することで設定しますが、http.confは管理者にしか編集できなくなっています。それに対して、.htaccessファイルは各ユーザーがディレクトリ単位に設定することができます。ファイルの構文は、主設定ファイルのhttp.confファイルと同じです。
注意事項
  • 基本的に、http.confファイルにアクセスできない場合以外は極力使用しない
  • FTPで転送する場合、ASCIIモードまたは、テキストモードを使用する
  • Windowsで編集する場合、一旦htaccess.txtなどに置き換え、サーバーに配置後にリネームする
  • 設置されたディレクトリと配下ディレクトリ全てに影響する
  • 構文誤りや管理者が許可していないディレクティブを使用した場合、該当ディレクトリ配下のファイルアクセスが、500 Internal Server Errorになる
  • 最終行には、改行を入れる

使い方

いろんな使い方ができるみたいですが。ざっくりとですが、こんなことができるみたいです。勉強しながら少しずつ記事にしていきたいと思っています。

使い方概要
  • セキュリティ関連
  • エラーページ制御
  • キャッシュ制御
  • ページ表示の高速化
  • 多言語対応
今回は、セキュリティ関連の使い方について記事を書きます。
セキュリティ関連
  • ディレクトリの内容を表示させない
  • ファイルへのアクセス制限
  • ディレクトリへのアクセス制限
  • パスワード(ベーシック)認証
  • DirectoryIndex

ディレクトリの内容を表示させない 
URIにスラッシュで終わるアクセスがあった場合、index.htmlなどのデフォルトで表示するファイルがない時、ディレクトリのファイル一覧が表示されてしまいます。
Optionsディレクティブを使用することで、ディレクトリのファイル一覧を表示させないように設定できます。
Options -Indexes
Optionsディレクティブは、どのサーバー機能を特定のディレクトリで使用可能とするかを制御します。⁺は元の設定に追加、‐は元の設定から削除します。上位ディレクトリで指定した設定は原則として下位ディレクトリまで適用される。下位ディレクトリで、Optionsディレクティブ設定をした場合、⁺は設定を有効に、‐は設定を無効に、そして±を省略した場合には新規に設定が適用されます。

Optionsディレクティブに指定できる値
All :MultiViewsを除いて全ての機能が有効になる
ExecCGI :mod_cgiによるCGIスクリプトの実行を許可する
FollowSymLinks :ディレクトリ内でシンボリックリンクをたどれる
Includes :mod_includeが提供するSSIを有効にする
IncludesNOEXEC :SSIを有効にするが、#exec、#execCGIは無効になる
Indexes :URLがディレクトリにマップするリクエストでDirectoryIndexで指定したファイルがディレクトリ内に存在しなければmod_autoindexがディレクトリ内の一覧を返す
MultiViews :mod_negotiationによるコンテントネゴシエーションされた言語ネゴシエーション機能を有効にする
SymLinksIfOwnerMatch :シンボリック先のファイルまたはディレクトリが、シンボリックの所有ユーザーIDと同じ場合にだけ、シンボリックリンクをたどれる
None : 全ての機能を無効にする
レンタルサーバーによっては、管理者によってOptionsディレクティブが使えないように制限されている場合があります。その場合には、次のようにすることでディレクトリ一覧を表示ができないようにできます。
IndexIgnore *
ファイルへのアクセス制限
FilesディレクティブやFilesMatchディレクティブで特定のファイルにアクセスできないようにアクセスを制限することができます。Filesディレクティブのブロック内に記述した設定をfilenameで指定したファイルにのみ適用します。ファイル名またワイルドカード文字列で指定することができます。下記の例は、Filesディレクティブを用いて、特定のIPアドレス(10.10.10.*)のみfilenameで指定したファイルへの全アクセスを許可する例です。
<Files filename> Order Deny,Allow Deny from all Allow from 10.10.10.*</Files>
FilesMatchディレクティブのブロック内に記述した設定を正規表現に一致するファイル名に適用します。下記の例は、FilesMatchディレクティブを用いて、.htaccessまたは.htpasswdファイルへの全アクセスを拒否する例です。
<FilesMatch "^\.(htaccess|htpasswd)$"> deny from all</FilesMatch>
ディレクトリへのアクセス制限
ディレクトリへのアクセス制限を行うには、deny from allと記載した.htaccessファイルを制限したい特定ディレクトリに配置します。下記の例は、特定ディレクトリへの全アクセスを拒否する例です。
 deny from all
パスワード(ベーシック)認証
パスワード認証を行うには、.htaccessファイルの他に.htpasswdファイルという、ユーザー名とパスワードを記載したファイルを用意します。特に指定をしなければ、.htaccessファイルを配置した特定ディレクトリ配下の全ファイルが認証対象になります。下記の例は、特定のファイル(pw-login.phpファイル)にのみパスワード認証を設定し、/home/XXXディレクトリに配置した.htpasswdファイルのユーザーIDとパスワードが一致すれば記述されているユーザーを許可する例です。
<Files pw-login.php> AuthType Basic AuthUserFile /home/XXX/.htpasswd AuthGroupFile /dev/null AuthName "Login Passwd Input" Require valid-user</Files>
DirectoryIndex
URIをスラッシュで終わるアクセスがあると、そのディレクトリにあるindex.htmlが呼ばれます。DirectoryIndexディレクティブを使用することで、デフォルトファイルを異なるファイルに変更できます。下記の例は、スラッシュで終わるアクセスがあった場合、記載した複数のリインデックスファイルのうち、先に記載したファイルから優先して呼ぶ場合の記述例です。全てのリインデックスファイルが見つからない場合は、ディレクトリのファイルリストを表示し、ディレクトリ一覧の表示が許可されていない場合には、403 Forbiddenになります。
DirectoryIndex index.html index.htm index.php index.cgi

2019/03/25

ホームサーバー 〜Fedora29 アップデート失敗⁈〜

つい先日、アップグレード失敗対応が終わったばかりのホームサーバーにOSのアップデートがありました。ちょっと不安な気持ちになりながらも、今ならシステムもデータベースもWordPressもバックアップがそのまま使える...ということで、思い切ってOSのアップデートを実施しましたが...

嫌な予感的中

OSのセキュリティ・アップデートやブラウザなどのアップデートなど、全部をまとめてアップデート...再起動..............................また、起動できない...エラーメッセージが表示されました。なんじゃこりゃあ。(* ´艸`)クスクス 笑ってる場合じゃないんだけど。
よく見てみると、journalctlってタイプしてsystem logを見ろといってるみたいなので、コマンドを入力するとシステムログが表示されます。
エラーメッセージ
Generating “/run/initramfs/rdsosreport.txt”

Entering emergency mode. Exit the shell to continue.
Type “journalctl” to view system logs.
You might want to save “/run/initramfs/rdsosreport.txt” to a USB stick or /boot after mounting them and attach it to a bug report.

システムログの確認

表示されるシステムログは、問題のある箇所が赤字で表示されますので、注意しながら見ていると直ぐに問題箇所を見つけることができます。ファイルシステムが壊れていて正常に認識できていないみたいです。
問題箇所
fsck failed .........
 ~中略~
Failed to start file System Check on ファイルシステム

ファイルシステムの修復

ファイルシステムのチェックと修復を行うfsckというコマンドを使って、ファイルシステムの修復を試みます。オプションには、障害発生時に修正する場合に利用が推奨されている。-fオプション(ファイルシステムがクリーンな場合でも全てのチェックを行う。)を指定します。コマンド実施後、何度か確認を求められるので、何度もyを入力するのが面倒な方は、修正箇所が見つかった場合に実行者に確認せずに修正を行う。-yオプションも併せて指定すると良いと思います。ファイルシステムの部分には修復するファイルシステム...つまり、システムログの確認で問題箇所として特定したファイルシステムを指定システムを指定してコマンドを実行。修復が完了したら、再起動して作業が完了です。
ファイルシステムの修復
fsck -fy ファイルシステム
今回は、この方法でリカバリーできましたが、必ずリカバリーできるものではないので、自分で運用、保守をしている方は、定期的にバックアップを取ったり、システムに変更を加えた時にバックアップを取ったりして、いざという時に備えるようにして下さいね。

2019/03/17

ホームサーバー 〜WordPressブログ バックアップ/リストア〜

以前、レンタルサーバーのCPU使用制限超過でリダイレクトされてしまった時には、WebサーバーもWordPressブログも起動出来ていたので、phpAdminでWordPressデータベース全てのバックアップを取りましたが、今回はWebサーバーもWordPressブログもPHPも動いていない状況です。そして、ホームサーバーなのでFTPは使わずに直接外付けディスクを接続してWordPressブログのWebページをバックアップできます。

データベースバックアップ/リストア

最初にデータベースのバックアップを取ります。ホームサーバーなので外付けディスクを直接接続して、転送容量を気にせずにバックアップを取ることができるので、念のため全データベースのバックアップを取ることにします。何度も調べなくて良いように、特定のデータベースをバックアップ/リストアするコマンドも残しておくことにします。
MySQLデータベースバックアップ
特定のデータベースのみバックアップする場合
mysqldump --single-transaction -u ユーザー名 -p DB名 > 出力ファイル名

全データベースをバックアップする場合
mysqldump --single-transaction -u ユーザー名 -p -x --all-databases > 出力ファイル名

MySQLデータベースリストア
特定のデータベースのみリストアする場合
mysqldump -u ユーザー名 -p DB名 < バックアップファイル名

全データベースをリストアする場合
mysqldump -u ユーザー名 -p < バックアップファイル名

 WordPressブログバックアップ/リストア

次にWordPressブログのバックアップです。こちらも、転送容量を気にせずにバックアップを取ることができるので、念のため全データのバックアップを取ることにします。あちこち見ないで良いように、最低限のデータをバックアップ/リストアする方法も残しておくことにします。リストアは、各ディレクトリにバックアップしたデータを上書きすれば良いのですが。
WordPressブログバックアップ
最低限のデータのみバックアップする場合
1.~/wp-config.php
2.~/wp-content/plugin/   ⇒ プラグイン格納
3.~/wp-content/themes/ ⇒ テーマ格納
4.~/wp-content/uploads/ ⇒ アップロードデータ格納

全データをバックアップする場合
WordPressのインストールディレクトリ配下の全データ
データベースのリストアでなく、WordPressのエクスポート機能で出力したXMLファイルをインポート機能でリストアする場合は、以前、使用していたテーマ、プラグインを有効にし、以前と同じパーマリンク設定をしてから、XMLファイルをインポート機能でリストアして下さい。正しく記事が復元されないのでくれぐれも注意して下さい。

使用していたテーマ、プラグイン、以前と同じパーマリンク設定が思い出せなくても手間は掛かりますが、最後の手段が有ります。MySQLのバックアップデータやWordPressのエクスポート機能で出力したXMLファイルは、テキストエディターで開くと記事の内容を読み取ることが出来るので、コピー&ペーストなどで復元することが可能です。

ただし、データベースのバックアップには、記事の履歴(修正の度に保存される各リビジョンのデータ)も含まれていますので、最新の情報を見るようする必要があります。

2019/03/09

ホームサーバー 〜WordPressブログ トラブル復旧〜

ホームサーバーで、運用しているWordPressブログサイト、MataKitena BlogがOSのアップグレード失敗で起動できなくなったトラブル対応の続きです。今回は、Webサーバーのapacheが起動出来て、無事にWordPressブログが起動出来たので、原因と対応方法を記事に残しておきます。データベースのバックアップとリストアについては次回記事にしますね。

WordPressブログが起動できない原因は

WordPressブログがどうして起動できないのか調べて分かったことは、データベースであるMySQLは起動出来ているということ。そして、Webサーバーのapacheを起動させてみたら...何やらPHPのライブラリに存在しないものがあると、エラーメッセージを出力して異常終了しているようです。これで、原因がはっきりしました。libnsl.so.1が存在しないので、Webサーバーが異常終了してしまいWordPressブログが起動出来ないのです。後は、インターネットで情報を探して対応すれば起動できそうです。
出力されたエラーメッセージの一部
...Cannot load modules/libphp7.so into server: libnsl.so.1: cannot open shared object file: No such file or directory...

そして、対応方法を探しに...

こういうことを調べている時に多いのですが、エラーメッセージをコピー&ペーストして検索すると英語のページがたくさん見つかるんです。英語が苦手な方は挫折しそうになっても、もうちょっと頑張って下さい。ここで、Google翻訳の出番です。検索結果のページを丸ごとか、部分的に翻訳すればほとんど日本語になった文書に翻訳されます。下記が、検索結果の中で1番解り易そうなページの要約です。なるほど...
発見した情報
Fedora 28以降で、msendユーティリティを使用しようすると、libnsl.so.1がnot foundと表示されるとのこと。
その原因は
Ferdoa 28以降、libnslパッケージはデフォルトでは含まれなくなり、libnsl2のみになったとのこと。
その対応方法は
後方互換性があるはずなのでlibnsl2ライブラリをlibnslにソフトリンクをしてみるか、libnslをインストールすればいいとのこと。 
ということは...利用しているOSが32bit、64bitのどちらかによって下記のコマンドでインストールできます。MataKitena Blogは、32bitなので、”dnf install libnsl”を実行してコマンドからWebサーバーのapatchを起動...起動完了です。念のため、システム起動時に自動起動されるかも確認しましたが、問題なく起動できました。
libnslのインストール方法
32bit OSの場合:dnf install libnsl
64bit OSの場合:dnf install libnsl.i686


2019/03/03

ホームサーバー 〜WordPressブログ システムバックアップ〜

ホームサーバーで、運用していたWordPressブログサイト、MataKitena BlogがOSのアップグレード失敗で起動できなくなったトラブル対応の続きです。システムバックアップとリストアについて記事を残しておきます。

システムバックアップとは

システムバックアップとは、いざという時のためにパーティションやハードドライブ全体のイメージをバックアップすることをいいます。本来は、今回のようにサーバー自体が起動できなくなる可能性があるOSのアップグレードなどの作業を実施する場合には、事前にシステムバックアップをしておけば、リストアすることで元に戻すことが出来るので安心できます。とはいえ、ハードドライブ自体が壊れてしまった場合、復元することは不可能なので壊れる前にバックアップすること。更に、同一システム内のハードドライブでは、不注意や予期しない事態で壊れることもありますので、外付けのハードドライブやクラウドにバックアップデータを保存するようにしましょう。

システムバックアップの方法は

ddコマンドを利用します。ddコマンドはdataset definitionの略で、ディスクに限らずデータをLowレベルで読み書きできるので、データの中身を無視して操作でき、OSが読み取れないファイルシステムでフォーマットされている場合にもバイナリーレベルで読み書きすることができます。 バックアップしたいドライブ以外から起動する必要があるので、Bootable USBやBootable DVDなどを作成しておきましょう。ddコマンドは、ifで指定した入力ファイルを指定されたブロックサイズで、必要に応じて変換をしながらofで指定した出力ファイルにコピーすることができます。OSのディストリビューションやバージョンにより異なる場合もありますので、利用するシステムのmanコマンドで調べたり、確認して下さい。
ddコマンド書式
dd [--help] [--version] [if=file] [of=file] [ibs=bytes] [obs=bytes] [bs=bytes] [cbs=bytes] [skip=blocks] [seek=blocks] [count=blocks] [conv={ascii, ebcdic, ibm, block, unblock, lcase, ucase, swab, noerror, notrunc, sync}]

今回はどうしたの

今回、ディスクユーティリティで起動ディスクを調べてみると.../dev/sda1と/dev/sda2の2パーティションが存在しました。準備しておいたBootable CDから起動して、それに合わせ、より大きな容量の外付けディスクに、より大きなサイズのパーティションを作成してシステムバックアップを実行しました。リストアは、if=で指定した入力ファイルとof=で指定した出力ファイルを入れ替えるだけです。まだ、WordPressブログが起動できていないですが、何か起こったとしても現在の状況までは戻すことが出来ます。
参考:今回実行したコマンド
dd if=/dev/sda1 of=/dev/sdb1 bs=64k conv=noerror,sync status=progress
dd if=/dev/sda2 of=/dev/sdb2 bs=64k conv=noerror,sync status=progress
あとは、データベースを含め、WordPressブログをバックアップして、本格的に復旧作業に備えます。

2019/02/10

ホームサーバー 〜WordPressブログ トラブル対応〜

先日、MataKitena's Owndで記事にしたように、ホームサーバーで、運用していたWordPressブログサイト、MataKitena BlogがOSのアップグレード失敗で起動できなくなりました。これまで何度も、何事も無く無事にアップグレード出来ていたのですが、手抜きしてバックアップを取っていなかった今回に限って…(_ _。)シュン

ということでトラブル対応開始

キリッ(๑•̀д•́๑)ホームサーバーのトラブル対応を開始することにしました。ところが‼いろいろ対応し始めて、あッそうだった…と思い出すことがたくさん。まずは、現状のシステムバックアップを取るため、古いカーネルイメージを選択して起動されることを確認。そして、いつ無くなっても、おかしくないと思われる32Bit OSのLiveイメージをダウンロードしてBootable USBを作成しておこうと思いましたが。ホームサーバーは、何世代も前のノートパソコン。もしかするとBIOSが対応してないかも知れない。さっそく、インターネットでBIOS画面の表示方法を調べて、Boot Menuを見てみましたが。やっぱり、Boot Deviceとして表示されるのは、Optical Drive、Floppy Disk、Hard Disk、Network…USB機器には対応してませんでした。

まだまだ想定の範囲内

それじゃあ、MAC BookでBootable DVDを作って…でも、作成したBootable DVDから起動しません。他には、DVDドライブ付きのパソコンもない。ということで、古い雑誌の付録に付いていたDVDとCDを用意してホームサーバーの問題の切り分けです。DVD、CDどちらも認識されません。そういえばOSをインストールする時に、同じ様なことをした憶えが。あの時は、CDレンズクリーナーを使ってクリーニングしたはず。見つけたCDレンズクリーナーで2回程クリーニングすると、CDを認識しましたがDVDは認識しません。以前もそうでした。Fedora29 Workstationのネットワークインストールイメージが536MB。これならCDに入ります。取りあえず32BitOSのインストールCDを作成して、CD起動することを確認しました。

一気にクリアインストール?

MataKitena Blogの復活に向けて、一気にクリアインストールとも考えましたが。WordPressブログのバックアップすら作成してません。ここは、手を抜かないで、システムバックアップ、MataKitena Blogのバックアップも作成して、いざとなったら、海外ドラマで見たことのある「じゃあ、プランBで…」みたいな奥の手を作っておくことにします。ということで、いざという時を想定してどんなバックアップを取っておくかを検討するので、この記事は、ここまで。続きは、しばらくお待ち下さい。近日公開予定です。

2019/01/13

教育 ~学びたい人が、学びたい時に、学びたい場所で…~

最近、ニュースで耳にしたことがある教育無償化。2020年の憲法改正時に実現しようとしているそうです。そんなこともあって、気になっていることがあります。それは、インターネットで「無料学習」とか「無料教育」で検索した時の検索結果です。幼児教育や大学講座、IT系のスキルアップ講座等々。動画や生放送視聴にWeb学習等、多種多様な教育が無料で受講できるようになってきているんです。

どんな無料教育があるの

ベネッセの知育子供ゲーム。あの、しまじろうのぬりえ、折り紙、えかき歌などのキッズゲームで親子で楽しく学ぶことができます。他にも、誰にでも、どこにでも無料で世界クラスレベルの教育を提供することを使命としているというKhan Academy。世界中の多くの人達が自分のペースで学ぶことが出来るんです。数学や科学、コンピュータプログラミング、歴史、美術史、経済学など色んなコースがあるそうです。しかも、数学でいうと幼稚園の算数レベルから微積分学レベルまで学ぶ人に合せて学習できます。日本でも、全ての人に平等な教育をオンラインでというコンセプトのFREE UNIVERSITYというオンライン教育プラットフォームが2018/10/12に開校されました。小中高大の授業やスポーツ、文化、職業体験、生涯学習、語学や資格試験など、ほぼすべての教育ジャンルを2030年までに網羅し、日本の教育を多言語化して、開発途上国などに向けて授業を配信することで平等な教育機会を全世界に提供していくそうです。

学びたい人が、学びたい時に、学びたい場所で…

そんなことが、出来るようになっていたんですね。まだまだ、通信環境が整備されていない地域やパソコン、タブレット、スマートフォンなどの機器を手にすることができない人々はどうするのか…というような、課題はたくさんあると思いますが。この素晴らしい思いや試みが継続されるのであれば、きっと、いつか、全てが実現される日が来るのではないでしょうか。このブログで紹介した無料教育は、ほんの少しだけです。企業や個人の方々が実施されているものも、たくさんあります。このような、思いや試みが継続されて、全てが実現されて、継続されると良いですね。