前書き
このチュートリアルでは、Apache 2のmod_rewrite
モジュールを使用してURL書き換えをアクティブ化し、管理する方法を学習します。 このモジュールを使用すると、URLをよりクリーンに書き換え、人間が読み取れるパスをコードフレンドリなクエリ文字列に変換したり、追加の条件に基づいてURLをリダイレクトしたりできます。
このガイドは2つの部分に分かれています。 最初の例では、サンプルWebサイトをセットアップし、簡単な書き換えの例を取り上げています。 2番目の部分には、一般的に使用される書き換えルールのさらに2つの詳細な例が含まれています。
前提条件
このチュートリアルを実行するには、次のものが必要です。
-
sudo非rootユーザーとファイアウォールを含むthis initial server setup tutorialでセットアップされた1つのUbuntu16.04サーバー。
-
How To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 16.04のステップ1に従って、サーバーにApache2をインストールします。
[[step-1 -—- enableing-mod_rewrite]] ==ステップ1—mod_rewriteを有効にする
まず、mod_rewrite
をアクティブ化する必要があります。 使用可能ですが、Apache 2のクリーンインストールでは有効になりません。
sudo a2enmod rewrite
これにより、モジュールがアクティブになるか、モジュールが既に有効になっていることを警告します。 これらの変更を有効にするには、Apacheを再起動します。
sudo systemctl restart apache2
mod_rewrite
が完全に有効になりました。 次のステップでは、リダイレクトの書き換えルールを定義するために使用する.htaccess
ファイルを設定します。
[[step-2 -—- setting-up-htaccess]] ==ステップ2—.htaccessの設定
.htaccess
ファイルを使用すると、サーバー構成ファイルにアクセスせずに書き換えルールを変更できます。 このため、.htaccess
はWebアプリケーションのセキュリティにとって重要です。 ファイル名の前のピリオドにより、ファイルが非表示になります。
[。注意]##
Note:.htaccess
ファイルに入れることができるルールは、サーバー構成ファイルに直接入れることもできます。 実際、official Apache documentationは、.htaccess
の代わりにサーバー構成ファイルを使用することをお勧めします。これは、Apacheがサーバー構成ファイルをより高速に処理するためです。
ただし、この単純な例では、パフォーマンスの向上はごくわずかです。 さらに、.htaccess
でルールを設定すると、特に同じサーバー上の複数のWebサイトで便利です。 変更を有効にするためにサーバーを再起動する必要はありません。また、これらのルールを編集するためにルート権限を必要とせず、メンテナンスを簡素化し、権限のないアカウントで変更を可能にします。 WordpressやJoomlaなどの一部の人気のあるオープンソースソフトウェアは、ソフトウェアがオンデマンドで追加のルールを変更および作成するために、.htaccess
ファイルに依存することがよくあります。
開始する前に、さらにいくつかの設定をセットアップして保護する必要があります。
デフォルトでは、Apacheは.htaccess
ファイルを使用して書き換えルールを適用することを禁止しているため、最初にファイルへの変更を許可する必要があります。 nano
またはお気に入りのテキストエディタを使用して、デフォルトのApache構成ファイルを開きます。
sudo nano /etc/apache2/sites-available/000-default.conf
そのファイル内には、最初の行から始まる<VirtualHost *:80>
ブロックがあります。 そのブロック内に、次の新しいブロックを追加して、構成ファイルが次のようになるようにします。 すべてのブロックが適切にインデントされていることを確認してください。
/etc/apache2/sites-available/000-default.conf
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
. . .
ファイルを保存して閉じます。 これらの変更を有効にするには、Apacheを再起動します。
sudo systemctl restart apache2
次に、Webルートに.htaccess
ファイルを作成します。
sudo nano /var/www/html/.htaccess
このファイルを新しいファイルの先頭に追加して、書き換えエンジンを有効にします。
/var/www/html/.htaccess
RewriteEngine on
ファイルを保存して終了します。
これで、Webアプリケーションのルーティングルールを管理するために使用できる操作可能な.htaccess
ファイルができました。 次のステップでは、書き換えルールのデモンストレーションに使用するサンプルWebサイトファイルを作成します。
[[step-3 -—- configuring-url-rewrites]] ==ステップ3—URL書き換えの構成
ここでは、きれいなURLをコードへの実際のパスに変換する基本的なURL書き換えを設定します。 具体的には、ユーザーがhttp://your_server_ip/about
にアクセスできるようにします。
Webルートにabout.html
という名前のファイルを作成することから始めます。
sudo nano /var/www/html/about.html
次のHTMLコードをファイルにコピーし、保存して閉じます。
/var/www/html/about.html
About Us
About Us
このページにはhttp://your_server_ip/about.html
でアクセスできますが、http://your_server_ip/about
にアクセスしようとすると、404 Not Foundエラーが表示されることに注意してください。 ユーザーが代わりに単にabout
を使用してページにアクセスする場合、書き換えルールはまさにこの機能を許可します。
すべてのRewriteRules
は、次の形式に従います。
一般的なRewriteRule構造
RewriteRule pattern substitution [flags]
-
RewriteRule
はディレクティブを指定します。 -
pattern
は、URLからの目的の文字列に一致するregular expressionです。これは、ビューアがブラウザに入力する文字列です。 -
substitution
は、実際のURLへのパスです。 ファイルApacheサーバーのパス。 -
flags
は、ルールの動作を変更できるオプションのパラメーターです。
.htaccess
ファイルを開きます。
sudo nano /var/www/html/.htaccess
最初の行の後に、赤でマークされたRewriteRule
を追加し、ファイルを保存します。
/var/www/html/.htaccess
RewriteEngine on
RewriteRule ^about$ about.html [NC]
この場合、^about$
はパターン、about.html
は置換、[NC]
はフラグです。 この例では、特別な意味を持ついくつかの文字を使用しています。
-
^
は、your_server_ip/
の後のURLの開始を示します。 -
$
は、URLの終わりを示します。 -
about
は、文字列「about」と一致します。 -
about.html
は、ユーザーがアクセスする実際のファイルです。 -
[NC]
は、ルールの大文字と小文字を区別しないフラグです。
これで、ブラウザでhttp://your_server_ip/about
にアクセスできるようになります。 実際、上記のルールでは、次のURLはabout.html
を指します。
-
ルール定義のため、
http://your_server_ip/about
。 -
ルールでは大文字と小文字が区別されないため、
http://your_server_ip/About
。 -
http://your_server_ip/about.html
、元の適切なファイル名が常に機能するため。
以下はしません:
-
http://your_server_ip/about/
は、$
文字を使用してabout
の後に何も存在しない可能性があることをルールが明示的に示しているためです。 -
ルール内の
about
文字列と一致しないため、http://your_server_ip/contact
。
これで、必要に応じて変更および拡張できる簡単なルールを備えた操作可能な.htaccess
ファイルができました。 以下のセクションでは、一般的に使用されるディレクティブの2つの追加例を示します。
[[example-1 -—- simplifying-query-strings-with-rewriterule]] ==例1—RewriteRuleを使用したクエリ文字列の簡略化
Webアプリケーションは、多くの場合、アドレスの後に疑問符(?
)を使用してURLに追加されるquery stringsを使用します。 個別のパラメーターは、アンパサンド(&
)を使用して区切られます。 クエリ文字列は、個々のアプリケーションページ間で追加データを渡すために使用できます。
たとえば、PHPで記述された検索結果ページでは、http://example.com/results.php?item=shirt&season=summer
のようなURLを使用できます。 この例では、2つの追加パラメーターが架空のresult.php
アプリケーションスクリプトに渡されます。値shirt
のitem
と、値summer
のseason
です。 アプリケーションは、クエリ文字列情報を使用して、訪問者に適したページを構築できます。
Apacheの書き換えルールは、上記のような長くて不快なリンクを、視覚的に入力および解釈しやすいfriendly URLsに単純化するためによく使用されます。 この例では、上記のリンクを単純化してhttp://example.com/shirt/summer
にします。 shirt
およびsummer
パラメータ値はまだアドレスにありますが、クエリ文字列とスクリプト名はありません。
これを実装する1つのルールを次に示します。
単純な置換
RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer [QSA]
shirt/summer
は要求されたアドレスで明示的に一致し、Apacheは代わりにresults.php?item=shirt&season=summer
を提供するように指示されます。
[QSA]
フラグは、一般的に書き換えルールで使用されます。 提供されたURLに追加のクエリ文字列を追加するようにApacheに指示するため、訪問者がhttp://example.com/shirt/summer?page=2
と入力すると、サーバーはresults.php?item=shirt&season=summer&page=2
で応答します。 それなしでは、追加のクエリ文字列は破棄されます。
この方法では目的の効果が得られますが、アイテム名と季節の両方がルールにハードコーディングされています。 これは、ルールがpants
のような他のアイテム、またはwinter
のような季節に対して機能しないことを意味します。
ルールをより一般的にするために、regular expressionsを使用して元のアドレスの一部を照合し、それらの部分を置換パターンで使用できます。 変更されたルールは次のようになります。
単純な置換
RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]
括弧内の最初の正規表現グループは、shirt
やpants
などの英数字と数字を含む文字列と一致し、一致したフラグメントを$1
変数として保存します。 括弧内の2番目の通常のrexpressionグループは、summer
、winter
、fall
、またはspring
と正確に一致し、同様に一致したフラグメントを$2
として保存します。
一致したフラグメントは、以前に使用したハードコードされたshirt
およびsummer
値の代わりに、item
およびseason
変数の結果のURLで使用されます。
上記は、たとえば、http://example.com/pants/summer
をhttp://example.com/results.php?item=pants&season=summer
に変換します。 この例は将来の証明でもあり、単一のルールを使用して複数のアイテムと季節を正しく書き換えることができます。
[[example-2 -—- adding-conditions-with-logic-using-rewriteconds]] ==例2—RewriteCondsを使用してロジックで条件を追加する
書き換えルールは、必ずしも制限なしで1つずつ評価されるとは限りません。 RewriteCond
ディレクティブを使用すると、書き換えルールに条件を追加して、ルールがいつ処理されるかを制御できます。 すべてのRewriteConds
は、次の形式に従います。
一般的なRewriteCond構造
RewriteCond TestString Condition [Flags]
-
RewriteCond
は、RewriteCond
ディレクティブを指定します。 -
TestString
は、テストする文字列です。 -
Condition
は、一致するパターンまたは条件です。 -
Flags
は、条件と評価ルールを変更する可能性のあるオプションのパラメーターです。
RewriteCond
がtrueと評価された場合、直後のRewriteRule
が考慮されます。 そうでない場合、ルールは破棄されます。 複数のRewriteCond
を次々に使用できます。デフォルトの動作では、次のルールが考慮されるためには、すべてがtrueと評価される必要があります。
例として、標準の404 Not Foundエラーページを表示する代わりに、サイト上の存在しないファイルまたはディレクトリへのすべてのリクエストをホームページにリダイレクトするとします。 これは、次の条件ルールで実現できます。
存在しないファイルおよびディレクトリへのすべてのリクエストをホームページにリダイレクトします
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /
上記で:
-
%{REQUEST_FILENAME}
はチェックする文字列です。 この場合、リクエストされたファイル名は、すべてのリクエストで利用可能なシステム変数です。 -
-f
は、要求された名前がディスク上に存在し、ファイルであるかどうかを確認する組み込み条件です。!
は否定演算子です。 組み合わせると、!-f
は、指定された名前が存在しないか、ファイルでない場合にのみtrueと評価されます。 -
同様に、
!-d
は、指定された名前が存在しないか、ディレクトリでない場合にのみtrueと評価されます。
最終行のRewriteRule
は、存在しないファイルまたはディレクトリへの要求に対してのみ有効になります。 RewriteRule
自体は非常に単純であり、すべての要求を/
Webサイトルートにリダイレクトします。
結論
mod_rewrite
は、人間が読めるURLを確保するために効果的に使用できる便利なApacheモジュールです。 このチュートリアルでは、RewriteRule
ディレクティブを使用して、クエリ文字列を含むURLをリダイレクトする方法を学習しました。 また、RewriteCond
ディレクティブを使用してURLを条件付きでリダイレクトする方法も学びました。
mod_rewrite
について詳しく知りたい場合は、Apache’s mod_rewrite IntroductionとApache’s official documentation for mod_rewriteをご覧ください。