前書き

Apacheは、モジュールを有効または無効にすることで機能をカスタマイズできるモジュラーWebサーバーです。 これにより、管理者はWebアプリケーションのニーズに合わせてApacheの機能を調整することができます。

このチュートリアルでは、CentOS 7サーバーにApacheをインストールし、 `+ mod_rewrite +`モジュールが有効になっていることを確認して、いくつかの重要な機能を調べます。

前提条件

このチュートリアルを実行する前に、sudo特権を持つ通常の非rootユーザーがいることを確認してください。 これらの権限を持つユーザーを設定する方法については、ガイドhttps://www.digitalocean.com/community/tutorials/how-to-create-a-sudo-user-on-centos-quickstart [ 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]:

Apacheを起動して実行したら、そのモジュールに注目しましょう。

ステップ2 – mod_rewriteの検証

CentOSバージョン7では、デフォルトで + mod_rewrite + Apacheモジュールが有効になっています。 これが `+ httpd `コマンドと ` -M +`フラグの場合に当てはまることを確認します。これは、ロードされたすべてのモジュールのリストを出力します:

httpd -M
Output . . .
remoteip_module (shared)
reqtimeout_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.
#
. . .

. . .

挿入モードを終了するには、「+ 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
#

. . .
</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パターン置換[フラグ] +

  • RewriteRule: `+ RewriteRule +`ディレクティブを指定します

  • Pattern:目的の文字列に一致するPCRE(Perl Compatible Regular Expression)。 正規表現の詳細については、https://www.digitalocean.com/community/tutorials/an-introduction-to-regular-expressions [こちら]をご覧ください。

  • Substitution:一致するリクエストの送信先

  • [Flags]:ルールを変更するためのオプションのパラメーター。 利用可能なフラグとその意味の詳細については、http://httpd.apache.org/docs/current/rewrite/flags.html [Rewrite Flags]のApacheのドキュメントを参照してください。

`+ RewriteRule `は ` mod_rewrite +`ディレクティブの主力です。このため、このチュートリアルでは主にこれに注目します。

ステップ5-RewriteCond構文の調査

`+ RewriteCond +`ディレクティブを使用すると、書き換えルールに条件を追加できます。 書き換え条件は、次の構造で構成されます。

+ RewriteCond TestString Condition [Flags] +

  • RewriteCond: `+ RewriteCond +`ディレクティブを指定します

  • TestString:テスト対象の文字列

  • Condition:一致するパターン

  • [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:///about.html
  • About Us が記載された白いページが表示されます。 アドレスバーから .html *を削除してページをリロードすると、404 * Not Found *エラーが表示されます。 Apacheは完全なファイル名でのみコンポーネントにアクセスできますが、書き換えルールを使用して変更できます。

ステップ7 – RewriteRuleのセットアップ

「About Us」ページへの訪問者は、「+。html +」を入力せずにアクセスできます。 これを達成するために、ルールを作成します。

`+ .htaccess`ファイルを開きます:

sudo vi /var/www/html/.htaccess

`+ RewriteEngine On +`行の後に、次を追加します。

/var/www/html/.htaccess

RewriteRule ^about$ about.html [NC]

ファイルを保存して終了します。

訪問者は、 + http:/// about + URLで* About Us *ページにアクセスできるようになりました。

書き換えルールを調べてみましょう。

`+ ^ about $ +`は、URLから一致するパターン、およびユーザーがブラウザに入力するものとして機能します。 +この例では、いくつかの_メタ文字_を使用して、用語がURL内の特定の場所にのみ存在するようにします。

  • `+ ^ `は、 ` / +`が取り除かれた後のURLの開始を示します。

  • `&`はURLの終わりを意味します

`+ about.html +`は、一致するパターンに遭遇したときにApacheが提供するファイルへのパスを示します。

`+ [NC] `は、ユーザーがURLに小文字と大文字を入力できるように、書き換えルールに大文字と小文字を区別しないように指示するフラグです。 たとえば、次のURLは ` about.html +`ファイルを指します:

  • /約

  • /約

  • /約

単純な書き換えルールを使用して、ユーザーが* About Us *ページにアクセスする方法に動的な側面を追加しました。

一般的なパターン

書き換えルールの基本的な理解が得られたので、このセクションで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

to:

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

to:

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 * Not Found *ページを配信することにより、無効なURLのリクエストを処理していました。 ただし、エラーページの代わりに、すべての不正なURLをホームページにリダイレクトする必要があります。 条件を使用して、要求されたファイルが存在するかどうかを確認できます。

/var/www/html/.htaccess

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^admin/(.*)$ /admin/home

これにより、 `+ / admin / `のようなものが ` / admin / home +`にリダイレクトされます。

上記のルールを分析してみましょう。

  • `+%{REQUEST_FILENAME} +`は要求された文字列をチェックします

  • +!-f + `!`または* not *演算子は、要求されたファイル名が存在しない場合、次の書き換えルールを実行することを示します。

  • + RewriteRule`はリクエストを + / admin / home + `にリダイレクトします

404 `+ ErrorDocument `を定義することはベストプラクティスに従います。 これを行うには、404エラーを ` error.html `ページに向ける ` ErrorDocument +`ルールを作成します。

/var/www/html/.htaccess

ErrorDocument 404 /error.html

これにより、 `+ error.html`ページへのHTTP 404応答をもたらすリクエストがリダイレクトされます。

例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 +`エラーが発生する場合があります。 このような状況のデバッグに関するヒントについては、http://stackoverflow.com/questions/9153262/tips-for-debugging-htaccess-rewrite-rules [このStackOverflowの投稿]を確認してください。