CentOS7でApache用にmod rewriteを設定する方法
序章
Apacheは、モジュールを有効または無効にすることで機能をカスタマイズできるモジュラーWebサーバーです。 これにより、管理者はWebアプリケーションのニーズに合わせてApacheの機能を調整できます。
このチュートリアルでは、CentOS 7サーバーにApacheをインストールし、mod_rewrite
モジュールが有効になっていることを確認し、いくつかの重要な機能について説明します。
前提条件
このチュートリアルを実行する前に、sudo権限を持つ通常のroot以外のユーザーがいることを確認してください。 これらの権限を持つユーザーを設定する方法の詳細については、ガイドCentOSでSudoユーザーを作成する方法を参照してください。
ステップ1-Apacheをインストールする
CentOSのデフォルトのパッケージ管理ユーティリティであるyum
を使用してApacheをインストールします。
sudo yum install httpd
Is this ok [y/d/N]:
メッセージが表示されたら、Y
と入力し、ENTER
キーを押してインストールを承認します。
次に、systemctl
ユーティリティを使用して、リクエストを処理するための子プロセスまたはスレッドのプールを作成するスタンドアロンプロセスであるApacheデーモンを起動します。
sudo systemctl start httpd
Apacheが正常に起動したことを確認するには、status
コマンドでその状態を確認します。
sudo systemctl status httpd
Output. . . systemd[1]: Starting The Apache HTTP Server... systemd[1]: Started The Apache HTTP Server.
Apacheが稼働している状態で、そのモジュールに注目しましょう。
ステップ2–mod_rewriteを確認する
CentOSバージョン7の時点で、mod_rewrite
Apacheモジュールはデフォルトで有効になっています。 これがhttpd
コマンドと-M
フラグの場合であることを確認します。これにより、ロードされたすべてのモジュールのリストが出力されます。
httpd -M
Output . . . remoteip_module (shared) reqtimeout_module (shared) rewrite_module (shared) setenvif_module (shared) slotmem_plain_module (shared) . . .
rewrite_module
が出力に表示されない場合は、vi
エディターで00-base.conf
ファイルを編集して有効にします。
sudo vi /etc/httpd/conf.modules.d/00-base.conf
テキストファイルが開いたら、i
と入力して挿入モードに入り、以下の強調表示された行を追加またはコメント解除します。
/etc/httpd/conf.modules.d/00-base.conf
# # This file loads most of the modules included with the Apache HTTP # Server itself. # . . . LoadModule rewrite_module modules/mod_rewrite.so . . .
次に、ESC
を押して、挿入モードを終了します。 次に、:x
と入力し、ENTER
キーを押して、ファイルを保存して終了します。
次に、Apacheを再起動して構成変更を適用します。
sudo systemctl restart httpd
Apacheがインストールされ、mod_rewrite
モジュールが有効になっているので、.htaccess
ファイルの使用を構成する準備が整いました。
ステップ3–.htaccessファイルを設定する
.htaccess
ファイルを使用すると、サーバー構成ファイルを変更することなく、ドメインごとにRewriteRule
を含むApacheのディレクティブを定義できます。 Linuxでは、ドット(.
)が前に付いたファイルは非表示として扱われます。
.htaccess
ファイルを使用する前に、AllowOverride
設定を更新して、Apacheディレクティブを上書きできるようにする必要があります。
sudo vi /etc/httpd/conf/httpd.conf
<Directory /var/www/html>
セクションを見つけて、AllowOverride
ディレクティブをNone
からAll
に変更します。
/etc/httpd/conf/httpd.conf
. . . <Directory /var/www/html> . . . # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # Options FileInfo AuthConfig Limit # AllowOverride All . . . </Directory> . . .
ファイルを保存して終了し、Apacheを再起動して変更を適用します。
sudo systemctl restart httpd
次に、Apacheのデフォルトのドキュメントルート/var/www/html
に.htaccess
ファイルを作成します。
sudo vi /var/www/html/.htaccess
次の行をファイルの先頭に追加して、RewriteEngine
をアクティブにします。これにより、Apacheに次のルールを処理するように指示されます。
/var/www/html/.htaccess
RewriteEngine On
ファイルを保存して終了します。
これで、必要に応じてURLを操作するためのルールを定義できる.htaccess
ファイルができました。 実際のルールを作成する前に、基本的なmod_rewrite
構文を確認してみましょう。
ステップ4–RewriteRule構文の調査
RewriteRule
ディレクティブを使用すると、URLに基づいてリクエストをApacheに再マップできます。 .htaccess
ファイルには複数の書き換えルールを含めることができますが、実行時にApacheは定義された順序でルールを適用します。 書き換えルールは、次の構造で構成されています。
RewriteRule Pattern Substitution [Flags]
- RewriteRule:
RewriteRule
ディレクティブを指定します - Pattern :目的の文字列に一致するPCRE(Perl互換正規表現)。 正規表現について詳しくは、こちらをご覧ください。
- 置換:一致するリクエストはどこに送信する必要がありますか
- [ Flags ]:ルールを変更するためのオプションのパラメーター。 使用可能なフラグとその意味の詳細については、 RewriteFlagsに関するApacheのドキュメントを参照してください。
RewriteRule
ディレクティブに焦点を当てます。
ステップ5–RewriteCond構文の調査
RewriteCond
ディレクティブを使用すると、書き換えルールに条件を追加できます。 書き換え条件は、次の構造で構成されます。
RewriteCond TestString Condition [Flags]
- RewriteCond:
RewriteCond
ディレクティブを指定します - TestString :テストする文字列
- 条件:一致するパターン
- [ Flags ]:条件を変更するためのオプションのパラメーター。
RewriteCond
ディレクティブでは、特定の条件がtrueと評価されない限り、Apacheはそれに続く書き換えルールを考慮することができません。
ステップ6–ファイルの設定
ユーザーがWebブラウザのアドレスバーにファイル拡張子(.html
)を入力せずに、about.html
ページにアクセスできるようにする基本的な書き換えルールを設定します。 ドキュメントのルートディレクトリにabout.html
ファイルを作成することから始めます。
sudo vi /var/www/html/about.html
次のHTMLコードをファイルにコピーします。
/var/www/html/about.html
<!DOCTYPE html> <html> <head> <title>About Us</title> </head> <body> <h1>About Us</h1> </body> </html>
ファイルを保存して終了します。
Webブラウザーで、次のアドレスに移動します。
http://server_domain_or_IP/about.html
会社概要が記載された白いページが表示されます。 アドレスバーから.htmlを削除してページをリロードすると、404 NotFoundエラーが発生します。 Apacheは完全なファイル名でのみコンポーネントにアクセスできますが、書き換えルールを使用して変更できます。
ステップ7–RewriteRuleを設定する
会社概要ページにアクセスした場合は、.html
と入力しなくてもアクセスできます。 これを実現するために、ルールを作成します。
.htaccess
ファイルを開きます。
sudo vi /var/www/html/.htaccess
RewriteEngine On
行の後に、以下を追加します。
/var/www/html/.htaccess
RewriteRule ^about$ about.html [NC]
ファイルを保存して終了します。
訪問者は、http://server_domain_or_IP/about
URLを使用してAboutUsページにアクセスできるようになりました。
書き換えルールを調べてみましょう。
^about$
は、URLから照合されるパターン、およびユーザーがブラウザーに入力するものとして機能します。 この例では、いくつかのメタ文字を使用して、用語がURL内の特定の場所にのみ存在するようにします。
^
は、server_domain_or_IP/
が削除された後のURLの開始を示します。&
はURLの終わりを意味します
about.html
は、一致するパターンに遭遇したときにApacheが提供するファイルへのパスを示します。
[NC]
は、ユーザーがURLに小文字と大文字を入力できるように、大文字と小文字を区別しないように書き換えルールに指示するフラグです。 たとえば、次のURLはabout.html
ファイルを指します。
- server_domain_or_IP/約
- server_domain_or_IP/概要
- server_domain_or_IP / ABOUT
シンプルな書き換えルールで、ユーザーが AboutUsページにアクセスする方法に動的な側面を追加しました。
一般的なパターン
書き換えルールの基本を理解したので、このセクションではさらに2つの例を検討します。
サンプルファイルを設定できますが、このチュートリアルにはそれらの作成は含まれていません。 書き換えルール自体だけです。
例1:RewriteRuleを使用したクエリ文字列の簡略化
Webアプリケーションは、疑問符文字(?
)を使用してURLに追加され、アンパサンド文字(&
)で区切られたクエリ文字列を使用することがよくあります。 Apacheは、書き換えルールを照合するときにこれら2つの文字を無視します。 ただし、ページ間でデータを渡すためにクエリ文字列が必要になる場合があります。 たとえば、PHPで記述された検索結果ページのURLは次のようになります。
http://example.com/results.php?item=shoes&type=women
代わりに、訪問者が次のよりクリーンなURLを使用できるようにしたいと考えています。
http://example.com/shoes/women
これらの結果は、単純な交換またはマッチングオプションの2つの方法のいずれかで達成できます。
例1A:単純な交換
単純な置換を実行する書き換えルールを作成し、長いクエリURLを単純化します。
/var/www/html/.htaccess
RewriteRule ^shoes/women$ results.php?item=shoes&type=women
ルールはshoes/women
をresults.php?item=shoes&type=women
にマップします。
例1B:マッチングオプション
場合によっては、クエリ文字列を一般化して、さまざまな種類の靴を含めることができます。 これは、次のようにすることで実現できます。
- ブール「OR」演算子である垂直パイプ
|
を使用して、一連のオプションを指定します ()
を使用して一致をグループ化し、$1
変数を使用してグループを参照し、最初に一致したグループを1
とします。
書き換えルールは次のようになります。
/var/www/html/.htaccess
RewriteRule ^shoes/(men|women|youth) results.php?item=shoes&type=$1
上記のルールは、shoes/
の後に指定されたタイプが続くURLに一致します。 これにより、元のURLが次のように変更されます。
http://example.com/shoes/men
になります:
http://example.com/results.php?item=shoes&type=men
このマッチングオプションにより、Apacheは、パターンごとに個別の書き換えルールを作成しなくても、複数のパターンを評価できます。
例1C:文字セットのマッチング
ただし、/shoes
だけに限定するのではなく、任意の項目も指定したいと思います。 したがって、次のことを行います。
- すべての英数字に一致する正規表現を記述します。 角かっこ式
[ ]
はその中の任意の文字と一致し、+
は角かっこで指定された任意の数の文字と一致します - 一致をグループ化し、ファイルの2番目の変数として
$2
を使用して参照します
/var/www/html/.htaccess
RewriteRule ^([A-Za-z0-9]+)/(men|women|youth) results.php?item=$1&type=$2
上記の例は変換します:
http://example.com/pants/men
に:
http://example.com/results.php?item=pants&type=men
マッチング機能を拡張して、URLの複数の側面を含めることに成功しました。
例1D:クエリ文字列の受け渡し
このセクションでは、新しい概念を紹介しませんが、発生する可能性のある問題に対処します。 上記の例を使用して、http://example.com/pants/men
をリダイレクトしたいが、追加のクエリ文字列?page=2
を渡すとします。 次のURLをマッピングします。
http://example.com/pants/men?page=2
に:
http://example.com/results.php?item=pants&type=men&page=2
現在の設定で上記のURLにアクセスしようとすると、クエリ文字列page=2
が失われることがあります。 これは、追加のQSA
フラグを使用して簡単に修正できます。これにより、クエリ文字列が結合されます。 以下に一致するように書き換えルールを変更すると、目的の動作が実現します。
/var/www/html.html
RewriteRule ^([A-Za-z0-9]+)/(men|women|youth) results.php?item=$1&type=$2 [QSA]
例2:ロジックを使用した条件の追加
次に、RewriteCond
ディレクティブの使用法を見ていきます。 書き換え条件がtrueと評価された場合、Apacheはそれに続くRewriteRule
を考慮します。
例2A:デフォルトページ
以前は、Apacheが404 NotFoundページを配信することで無効なURLのリクエストを処理するのを見ました。 ただし、エラーページではなく、不正な形式のURLをすべてホームページにリダイレクトする必要があります。 条件を使用して、要求されたファイルが存在するかどうかを確認できます。
/var/www/html/.htacces
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^admin/(.*)$ /admin/home
これにより、/admin/random_text
のようなものが/admin/home
にリダイレクトされます。
上記のルールを分析してみましょう。
%{REQUEST_FILENAME}
は要求された文字列をチェックします!-f
!
またはnot演算子は、要求されたファイル名が存在しない場合は、次の書き換えルールを実行することを示しています。RewriteRule
はリクエストを/admin/home
にリダイレクトします
404 ErrorDocument
の定義は、ベストプラクティスに従います。 そのために、ErrorDocument
ルールを作成して、404エラーをerror.html
ページにポイントします。
/var/www/html/.htaccess
ErrorDocument 404 /error.html
これにより、HTTP404応答が発生するリクエストがerror.html
ページにリダイレクトされます。
例2B:IPアドレスの制限
RewriteCond
を使用して、特定のIPアドレスによるサイトへのアクセスを許可できます。
この例では、を除くすべての場所からのトラフィックをブロックします198.51.100.24。
/var/www/html/.htaccess
RewriteCond %{REMOTE_ADDR} !^(198\.51\.100\.24)$ RewriteRule (.*) - [F,L]
ルール全体では、リソースを要求しているIPアドレスが198.51.100.24でない場合は、アクセスを許可しないと規定されています。
要するに:
%{REMOTE_ADDR}
はアドレス文字列です!^(198\.51\.100\.24)$
はIPアドレスを無効にします。\
バックスラッシュは、.
ドットをエスケープします。それ以外の場合は、任意の文字に一致するために使用されるメタ文字として機能します。F
フラグはアクセスを禁止し、L
フラグは、これが実行された場合に実行される最後のルールであることを示します。
特定のアドレスからのアクセスをブロックしたい場合は、代わりに次を使用してください。
/var/www/html/.htaccess
RewriteCond %{REMOTE_ADDR} ^(198\.51\.100\.24)$ RewriteRule (.*) - [F,L]
他の方法を使用してサイトへのトラフィックをブロックまたは許可することもできますが、.htaccess
ファイルで制限を設定するのが、これらの結果を達成するための最も簡単な方法です。
結論
このチュートリアルでは、.htaccess
ファイルを使用して、RewriteRule
およびRewriteCond
ディレクティブを操作しました。 書き換えルールを使用する理由はたくさんあります。次のリソースで、mod_rewrite
モジュールの機能について詳しく説明しています。
mod_rewrite
モジュールは、Apache Webサーバーの重要なコンポーネントであり、多くのことを実行できます。 ただし、物事が常に計画どおりに進むとは限りません。その場合、リダイレクトループまたはあいまいな500 forbidden
エラーが発生する可能性があります。 このような状況をデバッグするためのヒントについては、このStackOverflow投稿を確認してください。