CentOS7でApache用にmod rewriteを設定する方法

提供:Dev Guides
移動先:案内検索

序章

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_rewriteApacheモジュールはデフォルトで有効になっています。 これが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/aboutURLを使用して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/womenresults.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投稿を確認してください。