序章

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

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

前提条件

このチュートリアルを実行する前に、sudo権限を持つ通常のroot以外のユーザーがいることを確認してください。 これらの権限を持つユーザーを設定する方法の詳細については、ガイドCentOSでSudoユーザーを作成する方法を参照してください。

ステップ1-Apacheをインストールする

Apacheを使用してインストールします yum、CentOSのデフォルトのパッケージ管理ユーティリティ。

  1. sudo yum install httpd

プロンプトが表示されたら Is this ok [y/d/N]: メッセージ、タイプ Y を押して ENTER インストールを承認するためのキー。

次に、リクエストを処理するための子プロセスまたはスレッドのプールを作成するスタンドアロンプロセスであるApacheデーモンを起動します。 systemctl 効用:

  1. sudo systemctl start httpd

Apacheが正常に起動したことを確認するには、 status 指図:

  1. 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 ロードされたすべてのモジュールのリストを出力するフラグ:

  1. httpd -M
Output
. . . remoteip_module (shared) reqtimeout_module (shared) rewrite_module (shared) setenvif_module (shared) slotmem_plain_module (shared) . . .

の場合 rewrite_module 出力に表示されない場合は、編集して有効にします 00-base.conf とファイル vi 編集者:

  1. 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を再起動して構成変更を適用します。

  1. sudo systemctl restart httpd

Apacheがインストールされ、 mod_rewrite モジュールが有効になっているので、使用を構成する準備ができています .htaccess ファイル。

ステップ3–.htaccessファイルを設定する

A .htaccess ファイルを使用すると、Apacheのディレクティブを定義できます。 RewriteRule、サーバー構成ファイルを変更せずにドメインごとに。 Linuxでは、ドットが前に付いたファイル(.)は非表示として扱われます。

使用する前に .htaccess ファイル、更新する必要があります AllowOverride Apacheディレクティブを上書きできるように設定します。

  1. sudo vi /etc/httpd/conf/httpd.conf

を見つけます <Directory /var/www/html> セクションを変更し、 AllowOverride からの指令 NoneAll:

/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を再起動して変更を適用します。

  1. sudo systemctl restart httpd

次に、 .htaccess デフォルトのドキュメントルートのファイル、 /var/www/html、Apacheの場合。

  1. sudo vi /var/www/html/.htaccess

ファイルの先頭に次の行を追加して、 RewriteEngine、次のルールを処理するようにApacheに指示します。

/var/www/html/.htaccess
RewriteEngine On

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

あなたは今持っています .htaccess 必要に応じてURLを操作するためのルールを定義できるファイル。 実際のルールを作成する前に、基本的なルールを確認してみましょう。 mod_rewrite 構文。

ステップ4–RewriteRule構文の調査

The RewriteRule ディレクティブを使用すると、URLに基づいてリクエストをApacheに再マップできます。 A .htaccess ファイルには複数の書き換えルールを含めることができますが、実行時にApacheは定義された順序でルールを適用します。 書き換えルールは、次の構造で構成されています。

RewriteRule Pattern Substitution [Flags]

  • RewriteRule:を指定します RewriteRule 指令
  • Pattern :目的の文字列に一致するPCRE(Perl互換正規表現)。 正規表現について詳しくは、こちらをご覧ください。
  • 置換:一致するリクエストはどこに送信する必要がありますか
  • [ Flags ]:ルールを変更するためのオプションのパラメーター。 使用可能なフラグとその意味の詳細については、 RewriteFlagsに関するApacheのドキュメントを参照してください。

The RewriteRule の主力製品です mod_rewrite ディレクティブ。これが、このチュートリアルで主にそれに焦点を当てている理由です。

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

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

RewriteCond TestString Condition [Flags]

  • RewriteCond:を指定します RewriteCond 指令
  • TestString :テストする文字列
  • 条件:一致するパターン
  • [ Flags ]:条件を変更するためのオプションのパラメーター。

The RewriteCond ディレクティブは、特定の条件がtrueと評価されない限り、Apacheがそれに続くリライトルールを考慮することを許可しません。

ステップ6–ファイルの設定

ユーザーがアクセスできるように、基本的な書き換えルールを設定します。 about.html ファイル拡張子を入力せずにページ(.html)Webブラウザのアドレスバー。 を作成することから始めます about.html ドキュメントルートディレクトリ内のファイル:

  1. 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 ファイル:

  1. sudo vi /var/www/html/.htaccess

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

/var/www/html/.htaccess
RewriteRule ^about$ about.html [NC]

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

訪問者は、会社概要ページにアクセスできるようになりました。 http://server_domain_or_IP/about URL。

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

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

  • ^ 後のURLの開始を示します server_domain_or_IP/ 剥ぎ取られます。
  • & 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

上記のルールは、次のURLと一致します。 shoes/ 指定されたタイプが続きます。 これにより、元の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 the ! または、 not 演算子は、要求されたファイル名が存在しない場合は、次の書き換えルールを実行することを示します。
  • RewriteRule リクエストをにリダイレクトします /admin/home

404の定義 ErrorDocument ベストプラクティスに従います。 そのために、 ErrorDocument 404エラーを指すルール error.html ページ:

/var/www/html/.htaccess
ErrorDocument 404 /error.html

これにより、HTTP404応答が発生するリクエストがリダイレクトされます。 error.html ページ。

例2B:IPアドレスの制限

A 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アドレスを無効にします。 The \ バックスラッシュはエスケープします . ドット。それ以外の場合は、任意の文字に一致するために使用されるメタ文字として機能します。
  • The F フラグはアクセスを禁止し、 L フラグは、これが実行された場合に実行される最後のルールであることを示します。

特定のアドレスからのアクセスをブロックしたい場合は、代わりに次を使用してください。

/var/www/html/.htaccess
RewriteCond %{REMOTE_ADDR} ^(198\.51\.100\.24)$
RewriteRule (.*) - [F,L]

他の方法を使用してサイトへのトラフィックをブロックまたは許可することもできますが、 .htaccess ファイルは、これらの結果を達成するための最も簡単な方法です。

結論

このチュートリアルでは、 .htaccess 使用するファイル RewriteRuleRewriteCond ディレクティブ。 書き換えルールを使用する理由はたくさんあります。次のリソースでは、 mod_rewrite モジュール:

The mod_rewrite モジュールはApacheWebサーバーの重要なコンポーネントであり、それを使用して多くのことを実行できます。 ただし、物事は常に計画どおりに進むとは限りません。その場合、リダイレクトループやあいまいな状況に陥る可能性があります。 500 forbidden エラー。 このような状況をデバッグするためのヒントについては、このStackOverflow投稿を確認してください。