CentOS7でApache用にmod_rewriteを設定する方法
序章
Apacheは、モジュールを有効または無効にすることで機能をカスタマイズできるモジュラーWebサーバーです。 これにより、管理者はWebアプリケーションのニーズに合わせてApacheの機能を調整できます。
このチュートリアルでは、CentOS7サーバーにApacheをインストールします。 mod_rewrite
モジュールが有効になっていて、いくつかの重要な機能を調べます。
前提条件
このチュートリアルを実行する前に、sudo権限を持つ通常のroot以外のユーザーがいることを確認してください。 これらの権限を持つユーザーを設定する方法の詳細については、ガイドCentOSでSudoユーザーを作成する方法を参照してください。
ステップ1-Apacheをインストールする
Apacheを使用してインストールします yum
、CentOSのデフォルトのパッケージ管理ユーティリティ。
- sudo yum install httpd
プロンプトが表示されたら Is this ok [y/d/N]:
メッセージ、タイプ Y
を押して ENTER
インストールを承認するためのキー。
次に、リクエストを処理するための子プロセスまたはスレッドのプールを作成するスタンドアロンプロセスであるApacheデーモンを起動します。 systemctl
効用:
- 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
出力に表示されない場合は、編集して有効にします 00-base.conf
とファイル vi
編集者:
- sudo vi /etc/httpd/conf.modules.d/00-base.conf
テキストファイルが開いたら、次のように入力します i
挿入モードに入り、以下の強調表示された行を追加またはコメント解除します。
#
# 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ファイルを設定する
A .htaccess
ファイルを使用すると、Apacheのディレクティブを定義できます。 RewriteRule
、サーバー構成ファイルを変更せずにドメインごとに。 Linuxでは、ドットが前に付いたファイル(.
)は非表示として扱われます。
使用する前に .htaccess
ファイル、更新する必要があります AllowOverride
Apacheディレクティブを上書きできるように設定します。
- sudo vi /etc/httpd/conf/httpd.conf
を見つけます <Directory /var/www/html>
セクションを変更し、 AllowOverride
からの指令 None
に All
:
. . .
<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
次に、 .htaccess
デフォルトのドキュメントルートのファイル、 /var/www/html
、Apacheの場合。
- sudo vi /var/www/html/.htaccess
ファイルの先頭に次の行を追加して、 RewriteEngine
、次のルールを処理するようにApacheに指示します。
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
ドキュメントルートディレクトリ内のファイル:
- sudo vi /var/www/html/about.html
次の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
行に、次を追加します。
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を単純化します。
RewriteRule ^shoes/women$ results.php?item=shoes&type=women
ルールマップ shoes/women
に results.php?item=shoes&type=women
.
例1B:マッチングオプション
場合によっては、クエリ文字列を一般化して、さまざまな種類の靴を含めることができます。 これは、次のようにすることで実現できます。
- 垂直パイプを使用して一連のオプションを指定します
|
、ブール値の「OR」演算子 - を使用して試合をグループ化する
()
、次に、を使用してグループを参照します$1
変数、1
最初に一致したグループの場合
書き換えルールは次のようになります。
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番目の変数として
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
フラグ。これにより、クエリ文字列が結合されます。 以下に一致するように書き換えルールを変更すると、目的の動作が実現します。
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をすべてホームページにリダイレクトする必要があります。 条件を使用して、要求されたファイルが存在するかどうかを確認できます。
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
ページ:
ErrorDocument 404 /error.html
これにより、HTTP404応答が発生するリクエストがリダイレクトされます。 error.html
ページ。
例2B:IPアドレスの制限
A RewriteCond
特定のIPアドレスによるサイトへのアクセスを許可するために使用できます。
この例では、を除くすべての場所からのトラフィックをブロックします198.51.100.24。
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
フラグは、これが実行された場合に実行される最後のルールであることを示します。
特定のアドレスからのアクセスをブロックしたい場合は、代わりに次を使用してください。
RewriteCond %{REMOTE_ADDR} ^(198\.51\.100\.24)$
RewriteRule (.*) - [F,L]
他の方法を使用してサイトへのトラフィックをブロックまたは許可することもできますが、 .htaccess
ファイルは、これらの結果を達成するための最も簡単な方法です。
結論
このチュートリアルでは、 .htaccess
使用するファイル RewriteRule
と RewriteCond
ディレクティブ。 書き換えルールを使用する理由はたくさんあります。次のリソースでは、 mod_rewrite
モジュール:
The mod_rewrite
モジュールはApacheWebサーバーの重要なコンポーネントであり、それを使用して多くのことを実行できます。 ただし、物事は常に計画どおりに進むとは限りません。その場合、リダイレクトループやあいまいな状況に陥る可能性があります。 500 forbidden
エラー。 このような状況をデバッグするためのヒントについては、このStackOverflow投稿を確認してください。