Debian 9でApacheのmod_rewriteを使用してURLを書き換える方法

前書き

Apacheの `+ mod_rewrite +`モジュールを使用すると、URLをよりクリーンに書き換えて、人間が読み取れるパスをコードフレンドリーなクエリ文字列に変換できます。 また、条件に基づいてURLを書き換えることもできます。

`+ .htaccess `ファイルを使用すると、サーバー設定ファイルにアクセスせずに書き換えルールを作成および適用できます。 Webサイトのルートに ` .htaccess +`ファイルを配置することにより、サイトごとまたはディレクトリごとに書き換えを管理できます。

このチュートリアルでは、 `+ mod_rewrite `を有効にし、 ` .htaccess +`ファイルを使用して基本的なURLリダイレクションを作成し、いくつかの高度なユースケースを調べます。

前提条件

このチュートリアルを実行するには、次のものが必要です。

ステップ1-mod_rewriteの有効化

Apacheが書き換えルールを理解するためには、まず `+ mod_rewrite `を有効にする必要があります。 既にインストールされていますが、デフォルトのApacheインストールでは無効になっています。 モジュールを有効にするには、 ` a2enmod +`コマンドを使用します。

sudo a2enmod rewrite

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

sudo systemctl restart apache2

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

ステップ2-.htaccessのセットアップ

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

`+ .htaccess +`ファイルの使用を開始する前に、さらにいくつかの設定をセットアップして保護する必要があります。

デフォルトでは、Apacheは `+ .htaccess `ファイルを使用して書き換えルールを適用することを禁止しているため、最初にファイルへの変更を許可する必要があります。 ` nano +`またはhttps://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-9#step-six-%E2%80%94-completingを使用してデフォルトのApache設定ファイルを開きます-optional-configuration [お気に入りのテキストエディター]:

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

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

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>






   . . .
</VirtualHost>

ファイルを保存して閉じます。

設定を確認します。

sudo apache2ctl configtest

エラーがない場合は、Apacheを再起動して、変更を有効にします。

sudo systemctl restart apache2

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

sudo nano /var/www/html/.htaccess

このファイルを新しいファイルの先頭に追加して、書き換えエンジンを有効にします。

/var/www/html/.htaccess

RewriteEngine on

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

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

手順3-URL書き換えの構成

ここでは、きれいなURLをページへの実際のパスに変換する基本的なURL書き換えを設定します。 具体的には、ユーザーが「+ http:/// about 」にアクセスし、「 about.html +」というページを表示できるようにします。

Webルートに「+ about.html +」という名前のファイルを作成することから始めます。

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>

このページには `+ http:/// about.html `からアクセスできますが、 ` http:/// about `にアクセスしようとすると、* 404 Not Found *エラーが表示されることに注意してください。 代わりに「 / about +」を使用してページにアクセスするには、書き換えルールを作成します。

すべての `+ RewriteRules +`はこの形式に従います。

一般的なRewriteRule構造

RewriteRule pattern substitution [flags]
  • `+ RewriteRule +`はディレクティブを指定します。

  • `+ pattern +`はhttps://www.digitalocean.com/community/tutorials/an-introduction-to-regular-expressions [正規表現]であり、URLから目的の文字列に一致します。これは視聴者がブラウザ。

  • `+ substitution +`は実際のURLへのパスです。 Apacheが提供するファイルのパス。

  • `+ flags +`は、ルールの動作を変更できるオプションのパラメーターです。

URL書き換えルールを作成しましょう。 `+ .htaccess`ファイルを開きます:

sudo nano /var/www/html/.htaccess

最初の行の後に、次の `+ RewriteRule +`を追加してファイルを保存します。

/var/www/html/.htaccess

RewriteEngine on

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

  • 「+ ^ 」は、「 / +」の後のURLの開始を示します。

  • `+ $ +`はURLの終わりを示します。

  • `+ about +`は文字列“ about”に一致します。

  • `+ about.html +`は、ユーザーがアクセスする実際のファイルです。

  • `+ [NC] +`は、ルールの大文字と小文字を区別しないフラグです。

ブラウザで `+ http:/// about `にアクセスできるようになりました。 実際、上記のルールでは、次のURLも ` about.html +`を指します。

  • + http:/// about +、ルール定義のため。

  • ルールでは大文字と小文字が区別されないため、 + http:/// About +

  • + http:/// about.html +。元のファイル名が常に機能するためです。

ただし、以下は機能しません。

  • 「+ http:/// about / 」。これは、「 about 」の後に「 $ 」文字が表示されるため、「 about +」の後には何も存在しないことを明示的に示しているためです。

  • + http:/// contact +。ルールの `+ about +`文字列と一致しないためです。

これで、必要に応じて変更したり拡張したりできる基本的なルールが設定された操作可能な `+ .htaccess +`ファイルが作成されました。 以下のセクションでは、一般的に使用されるディレクティブの2つの追加例を示します。

例1-RewriteRuleによるクエリ文字列の簡素化

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

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

Apacheの書き換えルールは、上記の例のような長くて不愉快なリンクを簡素化するためによく使用されます。 この例では、上記のリンクを単純化して `+ http:// example.com / shirt / summer `にします。 ` shirt `と ` summer +`パラメーター値はまだアドレスにありますが、クエリ文字列とスクリプト名はありません。

これを実装する1つのルールを次に示します。

単純な置換

RewriteRule ^/$ results.php?item=&season= [QSA]

`+ shirt / summer `はリクエストされたアドレスで明示的に照合され、Apacheは代わりに ` results.php?item = shirt&season = summer +`を提供するように指示されます。

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

この方法では目的の効果が得られますが、アイテム名と季節の両方がルールにハードコーディングされています。 つまり、このルールは、「+ pants 」などの他のアイテムや、「 winter +」などの季節には機能しません。

ルールをより一般的にするには、https://www.digitalocean.com/community/tutorials/an-introduction-to-regular-expressions [正規表現]を使用して元のアドレスの一部を照合し、置換パターン。 変更されたルールは次のようになります。

単純な置換

RewriteRule ^/ results.php?item=$1&season=$2 [QSA]

括弧内の最初の正規表現グループは、英数字と「+ shirt 」や「 pants 」などの数字を含む文字列と一致し、一致したフラグメントを「 $ 1 」変数として保存します。 括弧内の2番目の正規表現グループは、「 summer」、「+ winter」、「+ fall」、または「+ spring」と正確に一致し、同様に一致したフラグメントを「+ $ 2 +」として保存します。

一致したフラグメントは、以前に使用したハードコードされた `+ shirt `および ` summer `値の代わりに、 ` item `および ` season +`変数で結果のURLで使用されます。

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

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

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

一般的なRewriteCond構造

RewriteCond TestString Condition [Flags]
  • `+ RewriteCond `は ` RewriteCond +`ディレクティブを指定します。

  • `+ TestString +`はテスト対象の文字列です。

  • `+ Condition +`は一致するパターンまたは条件です。

  • `+ Flags +`は、条件と評価ルールを変更する可能性があるオプションのパラメーターです。

`+ RewriteCond `がtrueと評価された場合、次の ` RewriteRule `が考慮されます。 そうでない場合、ルールは破棄されます。 複数の ` RewriteConds +`を次々に使用できますが、次のルールを考慮するためにはすべてがtrueと評価される必要があります。

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

存在しないファイルおよびディレクトリへのすべてのリクエストをホームページにリダイレクトします

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /

上記で:

  • `+%{REQUEST_FILENAME} +`はチェックする文字列です。 この場合、リクエストされたファイル名は、すべてのリクエストで利用可能なシステム変数です。

  • `+ -f `は、要求された名前がディスク上に存在し、ファイルであるかどうかを検証する組み込み条件です。 `!`は否定演算子です。 組み合わせて、 `!-f +`は、指定された名前が存在しないか、ファイルでない場合にのみtrueと評価されます。

  • 同様に、 `+!-d +`は、指定された名前が存在しないか、ディレクトリでない場合にのみtrueと評価されます。

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

結論

`+ mod_rewrite `を使用すると、人間が読めるURLを作成できます。 このチュートリアルでは、 ` RewriteRule `ディレクティブを使用して、クエリ文字列を含むURLを含むURLをリダイレクトする方法を学びました。 また、 ` RewriteCond +`ディレクティブを使用して条件付きでURLをリダイレクトする方法も学びました。

`+ mod_rewrite +`の詳細については、http://httpd.apache.org/docs/current/rewrite/intro.html [Apache’s mod_rewrite Introduction]およびhttp://httpd.apacheをご覧ください。 .org / docs / current / mod / mod_rewrite.html [mod_rewriteに関するApacheの公式ドキュメント]。

Related