Debian10でApache用にmod_rewriteを使用してURLを書き換える方法
序章
アパッチの mod_rewrite
モジュールを使用すると、URLをよりクリーンな方法で書き換えて、人間が読み取れるパスをコードに適したクエリ文字列に変換できます。 また、条件に基づいてURLを書き換えることもできます。
アン .htaccess
fileを使用すると、サーバー構成ファイルにアクセスせずに、書き換えルールを作成して適用できます。 を配置することによって .htaccess
Webサイトのルートにあるファイルを使用すると、サイトごとまたはディレクトリごとに書き換えを管理できます。
このチュートリアルでは、有効にします mod_rewrite
と使用 .htaccess
ファイルを使用して基本的なURLリダイレクトを作成し、いくつかの高度なユースケースを検討します。
前提条件
このチュートリアルに従うには、次のものが必要です。
-
Debian10初期サーバーセットアップガイドに従ってセットアップされた1台のDebian10サーバー。これには、sudo非rootユーザーとファイアウォールが含まれます。
-
Debian10にApacheWebサーバーをインストールする方法のステップ1と2に従ってインストールされたApache。
ステップ1—mod_rewriteを有効にする
Apacheが書き換えルールを理解するには、最初にアクティブ化する必要があります mod_rewrite
. すでにインストールされていますが、デフォルトのApacheインストールでは無効になっています。 使用 a2enmod
モジュールを有効にするコマンド:
- sudo a2enmod rewrite
これにより、モジュールがアクティブ化されるか、モジュールがすでに有効になっていることを警告します。 これらの変更を有効にするには、Apacheを再起動します。
- sudo systemctl restart apache2
mod_rewrite
これで完全に有効になります。 次のステップでは、 .htaccess
リダイレクトの書き換えルールを定義するために使用するファイル。
ステップ2—.htaccessを設定する
アン .htaccess
fileを使用すると、サーバー構成ファイルにアクセスせずに書き換えルールを変更できます。 このために、 .htaccess
Webアプリケーションのセキュリティにとって重要です。 ファイル名の前のピリオドは、ファイルが非表示になるようにします。
注:あなたが入れることができるすべてのルール .htaccess
ファイルは、サーバー構成ファイルに直接配置することもできます。 実際、公式のApacheドキュメントでは、代わりにサーバー構成ファイルを使用することを推奨しています .htaccess
より速い処理時間のおかげで。
ただし、この単純な例では、パフォーマンスの向上はごくわずかです。 さらに、ルールの設定 .htaccess
特に同じサーバー上の複数のWebサイトで便利です。 変更を有効にするためにサーバーを再起動したり、ルールを編集するためのroot権限を必要としないため、メンテナンスと、権限のないアカウントで変更を加えるプロセスが簡素化されます。 WordPressやJoomlaのような人気のあるオープンソースソフトウェアは .htaccess
必要に応じて変更や追加のルールを作成するためのファイル。
使い始める前に .htaccess
ファイルの場合は、さらにいくつかの設定をセットアップして保護する必要があります。
デフォルトでは、Apacheは .htaccess
書き換えルールを適用するファイルなので、最初にファイルへの変更を許可する必要があります。 を使用してデフォルトのApache設定ファイルを開きます nano
またはお気に入りのテキストエディタ:
- sudo nano /etc/apache2/sites-available/000-default.conf
そのファイルの中には、 <VirtualHost *:80>
最初の行から始まるブロック。 そのブロック内に、次の新しいブロックを追加して、構成ファイルが次のようになるようにします。 すべてのブロックが適切にインデントされていることを確認してください。
<VirtualHost *:80>
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
. . .
</VirtualHost>
ファイルを保存して閉じます。 使用した場合 nano
、を押してそうします CTRL+X
, Y
、 それから ENTER
.
次に、構成を確認します。
- sudo apache2ctl configtest
エラーがない場合は、Apacheを再起動して、変更を有効にします。
- sudo systemctl restart apache2
今、作成します .htaccess
Webルートのファイル:
- sudo nano /var/www/html/.htaccess
新しいファイルの先頭にこの行を追加して、書き換えエンジンをアクティブにします。
RewriteEngine on
ファイルを保存して終了します。
これで運用が可能になりました .htaccess
Webアプリケーションのルーティングルールを管理するために使用できるファイル。 次のステップでは、書き換えルールを示すために使用するサンプルWebサイトファイルを作成します。
ステップ3—URL書き換えの構成
ここでは、きれいなURLを実際のページへのパスに変換する基本的なURL書き換えを設定します。 具体的には、ユーザーがアクセスできるようにします http://your_server_ip/about
、と呼ばれるページを表示します about.html
.
名前の付いたファイルを作成することから始めます about.html
Webルート:
- sudo nano /var/www/html/about.html
次の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 pattern substitution [flags]
RewriteRule
ディレクティブを指定します。pattern
は正規表現であり、URLから目的の文字列に一致します。これは、ビューアがブラウザに入力する文字列です。substitution
実際のURLへのパスです。 Apacheが提供するファイルのパス。flags
ルールの動作を変更できるオプションのパラメータです。
URL書き換えルールを作成しましょう。 開く .htaccess
ファイル:
- sudo nano /var/www/html/.htaccess
最初の行の後に、次を追加します RewriteRule
ファイルを保存します。
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
、以来$
後に文字が表示されます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
. アプリケーションは、クエリ文字列情報を使用して、訪問者に適したページを作成できます。
上記の例のような長くて不快なリンクを、視覚的に入力および解釈しやすいわかりやすいURL に単純化するために、Apacheの書き換えルールがよく使用されます。 この例では、上記のリンクを単純化して次のようにします。 http://example.com/shirt/summer
. The shirt
と summer
パラメータ値はまだアドレスにありますが、クエリ文字列とスクリプト名はありません。
これを実装するための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番目の正規表現グループは完全に一致します summer
, winter
, fall
、 また spring
、同様に、一致したフラグメントを次のように保存します $2
.
一致したフラグメントは、結果のURLで使用されます。 item
と season
ハードコードされた代わりに変数 shirt
と summer
以前に使用した値。
上記は、例えば、変換します http://example.com/pants/summer
の中へ http://example.com/results.php?item=pants&season=summer
. この例は将来も保証されており、単一のルールを使用して複数のアイテムとシーズンを正しく書き換えることができます。
例2—RewriteCondsを使用してロジックで条件を追加する
書き換えルールは、必ずしも制限なく1つずつ評価されるとは限りません。 The RewriteCond
ディレクティブを使用すると、書き換えルールに条件を追加して、ルールがいつ処理されるかを制御できます。 全て RewriteConds
次の形式に従ってください。
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
は、要求された名前がディスク上に存在し、ファイルであるかどうかを確認する組み込み条件です。 The!
否定演算子です。 組み合わせて、!-f
指定された名前が存在しないか、ファイルでない場合にのみtrueと評価されます。- 同様に、
!-d
指定された名前が存在しないか、ディレクトリでない場合にのみtrueと評価されます。
The RewriteRule
最終行のは、存在しないファイルまたはディレクトリへのリクエストに対してのみ有効になります。 The RewriteRule
それ自体は非常にシンプルで、すべてのリクエストをにリダイレクトします /
ウェブサイトのルート。
結論
mod_rewrite
人間が読めるURLを作成できます。 このチュートリアルでは、 RewriteRule
クエリ文字列を含むURLをリダイレクトするディレクティブ。 また、を使用してURLを条件付きでリダイレクトする方法も学びました。 RewriteCond
指令。
あなたがについてもっと知りたいなら mod_rewrite
、Apacheのmod_rewriteの概要およびApacheのmod_rewriteの公式ドキュメントをご覧ください。