序章

このチュートリアルでは、Apache 2を使用してURL書き換えをアクティブ化し、管理する方法を学習します。 mod_rewrite モジュール。 このモジュールを使用すると、URLをよりクリーンな方法で書き換え、人間が読める形式のパスをコードに適したクエリ文字列に変換したり、追加の条件に基づいてURLをリダイレクトしたりできます。

このガイドは2部に分かれています。 最初はサンプルのウェブサイトをセットアップし、簡単な書き直しの例をカバーしています。 2番目の部分には、一般的に使用される書き換えルールのさらに2つの詳細な例が含まれています。

前提条件

このチュートリアルに従うには、次のものが必要です。

ステップ1—mod_rewriteを有効にする

まず、アクティベートする必要があります mod_rewrite. 利用可能ですが、Apache2のクリーンインストールでは有効になりません。

  1. sudo a2enmod rewrite

これにより、モジュールがアクティブ化されるか、モジュールがすでに有効になっていることを警告します。 これらの変更を有効にするには、Apacheを再起動します。

  1. sudo systemctl restart apache2

mod_rewrite これで完全に有効になります。 次のステップでは、 .htaccess リダイレクトの書き換えルールを定義するために使用するファイル。

ステップ2—.htaccessを設定する

アン .htaccess fileを使用すると、サーバー構成ファイルにアクセスせずに書き換えルールを変更できます。 このために、 .htaccess Webアプリケーションのセキュリティにとって重要です。 ファイル名の前のピリオドは、ファイルが非表示になるようにします。

注:あなたが入れることができるすべてのルール .htaccess ファイルは、サーバー構成ファイルに直接入れることもできます。 実際、公式のApacheドキュメントでは、代わりにサーバー構成ファイルを使用することを推奨しています .htaccess Apacheはそれをそのように速く処理するからです。

ただし、この単純な例では、パフォーマンスの向上はごくわずかです。 さらに、ルールの設定 .htaccess 特に同じサーバー上の複数のWebサイトで便利です。 変更を有効にするためにサーバーを再起動する必要はなく、これらのルールを編集するためのroot権限も必要ありません。これにより、メンテナンスが簡素化され、非特権アカウントで変更が可能になります。 WordPressやJoomlaなどの人気のあるオープンソースソフトウェアは、多くの場合、 .htaccess ソフトウェアがオンデマンドで追加のルールを変更および作成するためのファイル。

開始する前に、さらにいくつかの設定をセットアップして保護する必要があります。

デフォルトでは、Apacheは .htaccess 書き換えルールを適用するファイルなので、最初にファイルへの変更を許可する必要があります。 を使用してデフォルトのApache設定ファイルを開きます nano またはお気に入りのテキストエディタ。

  1. sudo nano /etc/apache2/sites-available/000-default.conf

そのファイルの中には、 <VirtualHost *:80> 最初の行から始まるブロック。 そのブロック内に、次の新しいブロックを追加して、構成ファイルが次のようになるようにします。 すべてのブロックが適切にインデントされていることを確認してください。

/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
    <Directory /var/www/html>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    
    . . .
</VirtualHost>

ファイルを保存して閉じます。 これらの変更を有効にするには、Apacheを再起動します。

  1. sudo systemctl restart apache2

次に、を作成します .htaccess Webルートのファイル。

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

新しいファイルの先頭にこの行を追加して、書き換えエンジンをアクティブにします。

/var/www/html/.htaccess
RewriteEngine on

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

これで運用が可能になりました .htaccess Webアプリケーションのルーティングルールを管理するために使用できるファイル。 次のステップでは、書き換えルールを示すために使用するサンプルWebサイトファイルを作成します。

ステップ3—URL書き換えの構成

ここでは、基本的なURL書き換えを設定します。これにより、きれいなURLが実際のコードへのパスに変換されます。 具体的には、ユーザーがアクセスできるようにします http://your_server_ip/about.

名前の付いたファイルを作成することから始めます about.html Webルートで。

  1. sudo nano /var/www/html/about.html

次のHTMLコードをファイルにコピーし、保存して閉じます。

/var/www/html/about.html
<html>
    <head>
        <title>About Us</title>
    </head>
    <body>
        <h1>About Us</h1>
    </body>
</html>

このページには、次のURLからアクセスできます。 http://your_server_ip/about.html、ただし、アクセスしようとすると注意してください http://your_server_ip/about 404 NotFoundエラーが表示されます。 ユーザーが単にを使用してページにアクセスする場合 about 代わりに、書き換えルールにより、まさにこの機能が可能になります。

全て RewriteRules 次の形式に従ってください。

一般的なRewriteRule構造
RewriteRule pattern substitution [flags]
  • RewriteRule ディレクティブを指定します。
  • pattern正規表現であり、URLから目的の文字列に一致します。これは、ビューアがブラウザに入力する文字列です。
  • substitution 実際のURLへのパスです。 ファイルApacheサーバーのパス。
  • flags ルールの動作を変更できるオプションのパラメータです。

開く .htaccess ファイル。

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

最初の行の後に、 RewriteRule 赤でマークされ、ファイルを保存します。

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

この場合、 ^about$ パターンです、 about.html 置換であり、 [NC] フラグです。 この例では、特別な意味を持ついくつかの文字を使用しています。

  • ^ 後のURLの開始を示します your_server_ip/.
  • $ 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 を使用して $ キャラクター。
  • http://your_server_ip/contact、それは一致しないため about ルール内の文字列。

これで運用が可能になりました .htaccess 必要に応じて変更および拡張できる簡単なルールを含むファイル。 次のセクションでは、一般的に使用されるディレクティブの2つの追加の例を示します。

例1—RewriteRuleを使用したクエリ文字列の簡略化

Webアプリケーションは、多くの場合、クエリ文字列を使用します。この文字列は、疑問符(?)アドレスの後。 個別のパラメーターは、アンパサンド(&). クエリ文字列は、個々のアプリケーションページ間で追加のデータを渡すために使用できます。

たとえば、PHPで記述された検索結果ページでは、次のようなURLを使用できます。 http://example.com/results.php?item=shirt&season=summer. この例では、2つの追加パラメーターが架空のものに渡されます result.php アプリケーションスクリプト: item、値付き shirt、 と season 値で summer. アプリケーションは、クエリ文字列情報を使用して、訪問者に適したページを作成できます。

Apacheの書き換えルールは、上記のような長くて不快なリンクを、視覚的に入力および解釈しやすいわかりやすいURLに単純化するためによく使用されます。 この例では、上記のリンクを単純化して次のようにします。 http://example.com/shirt/summer. The shirtsummer パラメータ値はまだアドレスにありますが、クエリ文字列とスクリプト名はありません。

これを実装するための1つのルールは次のとおりです。

単純な置換
RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer [QSA]

The shirt/summer 要求されたアドレスで明示的に一致し、Apacheはサービスを提供するように指示されます results.php?item=shirt&season=summer 代わりは。

The [QSA] フラグは、書き換えルールで一般的に使用されます。 提供されたURLに追加のクエリ文字列を追加するようにApacheに指示するため、訪問者が次のように入力した場合 http://example.com/shirt/summer?page=2 サーバーは次のように応答します results.php?item=shirt&season=summer&page=2. これがないと、追加のクエリ文字列は破棄されます。

この方法では目的の効果が得られますが、アイテム名とシーズンの両方がルールにハードコードされています。 これは、ルールが次のような他のアイテムに対しては機能しないことを意味します。 pants、または季節、のような winter.

ルールをより一般的にするために、正規表現を使用して元のアドレスの一部を照合し、それらの部分を置換パターンで使用できます。 変更されたルールは次のようになります。

単純な置換
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.

一致したフラグメントは、結果のURLで使用されます。 itemseason ハードコードされた代わりに変数 shirtsummer 以前に使用した値。

上記は、例えば、変換します http://example.com/pants/summer の中へ http://example.com/results.php?item=pants&season=summer. この例は将来も保証されており、単一のルールを使用して複数のアイテムと季節を正しく書き換えることができます。

例2—RewriteCondsを使用してロジックで条件を追加する

書き換えルールは、必ずしも制限なく1つずつ評価されるとは限りません。 The RewriteCond ディレクティブを使用すると、書き換えルールに条件を追加して、ルールがいつ処理されるかを制御できます。 全て RewriteConds 次の形式に従ってください。

一般的なRewriteCond構造
RewriteCond TestString Condition [Flags]
  • RewriteCond を指定します RewriteCond 指令。
  • TestString テストする文字列です。
  • Condition 一致するパターンまたは条件です。
  • Flags 条件と評価ルールを変更する可能性のあるオプションのパラメータです。

もし RewriteCond 真と評価され、 RewriteRule 直後が考慮されます。 そうでない場合、ルールは破棄されます。 多数 RewriteCond 次々に使用でき、デフォルトの動作では、次のルールが考慮されるためには、すべてがtrueと評価される必要があります。

例として、標準の 404 Not Found エラーページを表示する代わりに、サイト上の存在しないファイルまたはディレクトリへのすべてのリクエストをホームページにリダイレクトするとします。 これは、次の条件ルールで実現できます。

存在しないファイルおよびディレクトリへのすべてのリクエストをホームページにリダイレクトします
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /

上記で:

  • %{REQUEST_FILENAME} チェックする文字列です。 この場合、それは要求されたファイル名であり、すべての要求に使用できるシステム変数です。
  • -f は、要求された名前がディスク上に存在し、ファイルであるかどうかを確認する組み込み条件です。 The ! 否定演算子です。 組み合わせて、 !-f 指定された名前が存在しないか、ファイルでない場合にのみtrueと評価されます。
  • 同様に、 !-d 指定された名前が存在しないか、ディレクトリでない場合にのみtrueと評価されます。

The RewriteRule 最終行のは、存在しないファイルまたはディレクトリへのリクエストに対してのみ有効になります。 The RewriteRule それ自体は非常にシンプルで、すべてのリクエストをにリダイレクトします / ウェブサイトのルート。

結論

mod_rewrite は、人間が読めるURLを確保するために効果的に使用できる便利なApacheモジュールです。 このチュートリアルでは、 RewriteRule クエリ文字列を含むURLをリダイレクトするディレクティブ。 また、を使用してURLを条件付きでリダイレクトする方法も学びました。 RewriteCond 指令。

あなたがについてもっと知りたいなら mod_rewriteApacheのmod_rewriteの概要およびApacheのmod_rewriteの公式ドキュメントをご覧ください。