Ubuntu14.04でApache用にmod_rewriteを設定する方法
序章
このチュートリアルでは、Apache2を使用してURL書き換えをアクティブ化し、管理する方法を学習します。 mod_rewrite
モジュール。 このツールを使用すると、URLをよりクリーンな方法で書き換えて、人間が読める形式のパスをコードに適したクエリ文字列に変換できます。
このガイドは2つに分かれています。1つ目はサンプルWebアプリケーションをセットアップし、2つ目は一般的に使用される書き換えルールについて説明しています。
前提条件
このチュートリアルに従うには、次のものが必要です。
- 1つの新しいUbuntu14.04ドロップレット
- このチュートリアルの手順2と3に従って設定できるsudo非rootユーザー
ステップ1—Apacheをインストールする
このステップでは、組み込みのパッケージインストーラーを使用します。 apt-get
. 管理が大幅に簡素化され、クリーンなインストールが容易になります。
まず、システムのパッケージインデックスを更新します。 これにより、古いパッケージや古いパッケージがインストールに干渉しないようになります。
- sudo apt-get update
Apache2は前述のHTTPサーバーであり、世界で最も一般的に使用されています。 インストールするには、次のコマンドを実行します。
- sudo apt-get install apache2
最も人気のある2つのオープンソースWebサーバーであるNginxとApache2の違いについては、この記事を参照してください。
ステップ2—mod_rewriteを有効にする
今、私たちはアクティブ化する必要があります mod_rewrite
.
- sudo a2enmod rewrite
これにより、モジュールがアクティブ化されるか、モジュールがすでに有効になっていることを警告します。 これらの変更を有効にするには、Apacheを再起動します。
- sudo service apache2 restart
ステップ3—.htaccessを設定する
このセクションでは、 .htaccess
より簡単な書き換えルール管理のためのファイル。
A .htaccess
fileを使用すると、サーバー構成ファイルにアクセスせずに書き換えルールを変更できます。 このために、 .htaccess
Webアプリケーションのセキュリティにとって重要です。 ファイル名の前のピリオドは、ファイルが非表示になるようにします。
開始する前に、さらにいくつかの設定をセットアップして保護する必要があります。
まず、変更を許可します .htaccess
ファイル。 を使用してデフォルトのApache設定ファイルを開きます nano
またはお気に入りのテキストエディタ。
- sudo nano /etc/apache2/sites-enabled/000-default.conf
そのファイルの中には、 <VirtualHost *:80>
1行目のブロック。 そのブロック内に、次のブロックを追加します。
/etc/apache2/sites-available/default<Directory /var/www/html>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
これで、ファイルは次のように一致するはずです。 すべてのブロックが適切にインデントされていることを確認してください。
/etc/apache2/sites-available/default<VirtualHost *:80>
<Directory /var/www/html>
. . .
</Directory>
. . .
</VirtualHost>
これらの変更を有効にするには、Apacheを再起動します。
- sudo service apache2 restart
次に、を作成します .htaccess
ファイル。
- sudo nano /var/www/html/.htaccess
新しいファイルの先頭にこの最初の行を追加して、 RewriteEngine
.
/var/www/html/.htaccessRewriteEngine on
ファイルを保存して終了します。
他のユーザーがあなたの読み取りのみを行えるようにするため .htaccess
、次のコマンドを実行して権限を更新します。
- sudo chmod 644 /var/www/html/.htaccess
これで運用が可能になりました .htaccess
ファイル、Webアプリケーションのルーティングルールを管理します。
ステップ4—ファイルの設定
このセクションでは、基本的なURL書き換えを設定します。これにより、きれいなURLが実際のコードへのパスに変換されます。 具体的には、ユーザーがアクセスできるようにします example.com/about
.
まず、という名前のファイルを作成します 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>
次のWebアプリケーションにアクセスできます。 your_server_ip/about.html
また example.com/about.html
. ここで、 about.html
アクセス可能です。 アクセスしようとすると your_server_ip/about
、 NotFoundエラーが発生します。 ユーザーにアクセスしてもらいたい about
代わりは。 私たちの書き換えルールは、まさにこの機能を可能にします。
開く .htaccess
ファイル。
- sudo nano /var/www/html/.htaccess
最初の行の後に、以下を追加します。
/var/www/html/.htaccessRewriteRule ^about$ about.html [NC]
これで、ファイルは次のようになります。
/var/www/html/.htaccessRewriteEngine on
RewriteRule ^about$ about.html [NC]
おめでとう。 これでアクセスできます example.com/about
あなたのブラウザで!
これは、すべての書き換えルールが従う一般的な構文を示す簡単な例です。
^about$
URLから照合される文字列です。 つまり、それは視聴者がブラウザに入力するものです。 この例では、いくつかのメタ文字を使用しています。
^
後のURLの開始を示しますexample.com/
剥ぎ取られます。$
URLの終わりを示しますabout
文字列「about」に一致します
about.html
ユーザーがアクセスする実際のパスです。 つまり、Apacheは引き続きサービスを提供します about.html
ファイル。
[NC]
URLの大文字と小文字を無視するフラグです。
上記のルールでは、次のURLがポイントします about.html
:
example.com/about
example.com/About
example.com/about.html
以下はしません:
example.com/about/
example.com/contact
一般的なパターン
このセクションでは、一般的に使用されるディレクティブをいくつか示します。
これでWebアプリケーションが実行され、保護されたものによって管理されます .htaccess
ファイル。 最も単純な例は上に含まれています。 このセクションでは、さらに2つの例を検討します。
必要に応じて、結果パスにサンプルファイルを設定できますが、このチュートリアルにはHTMLファイルとPHPファイルの作成は含まれていません。 書き直しのルールだけです。
例1:RewriteRuleを使用したクエリ文字列の簡略化
全て RewriteRule
■次の形式に従います。
RewriteRule pattern substitution [flags]
- RewriteRule :ディレクティブを指定します
RewriteRule
- pattern :目的の文字列に一致する正規表現
- 置換:実際のURLへのパス
- flags :ルールを変更できるオプションのパラメーター
Webアプリケーションは、多くの場合、クエリ文字列を使用します。この文字列は、 ?
疑問符と区切り文字 &
アンパサンド。 書き換えルールを照合する場合、これらは無視されます。 ただし、ページ間でデータを渡すためにクエリ文字列が必要になる場合があります。 たとえば、PHPで記述された検索結果ページは、次のようなものを利用する場合があります。
http://example.com/results.php?item=shirt&season=summer
この例では、これを単純化して次のようにします。
http://example.com/shirt/summer
例1A:単純な交換
書き換えルールを使用すると、次のように使用できます。
/var/www/html/.htaccessRewriteRule ^shirt/summer$ results.php?item=shirt&season=summer
上記は実際にマップするので、かなり自明です shirt/summer
に results.php?item=shirt&season=summer
. これにより、目的の効果が得られます。
例1B:マッチングオプション
ただし、これを一般化してすべての季節を含めたいと思います。 したがって、次のことを行います。
- を使用して一連のオプションを指定します
|
「OR」を意味するブール値 - を使用して試合をグループ化する
()
、次にを使用してグループを参照します$1
、 と1
最初に一致したグループの場合
書き換えルールは次のようになります。
/var/www/html/.htaccessRewriteRule ^shirt/(summer|winter|fall|spring) results.php?item=shirt&season=$1
上記のルールは、次のURLと一致します。 shirt/
指定された季節が続きます。 そのシーズンはを使用してグループ化されます ()
その後、 $1
次のパスで。 これは、たとえば、次のことを意味します。
http://example.com/shirt/winter
になります:
http://example.com/results.php?item=shirt&season=winter
これにより、目的の効果も得られます。
例1C:文字セットのマッチング
ただし、URLだけでなく、あらゆる種類のアイテムを指定したいと思います。 /shirt
. したがって、次のことを行います。
- すべての英数字に一致する正規表現を記述します。 角かっこ式
[]
その中の任意の文字と一致し、+
角かっこで指定された任意の数の文字に一致します - 一致をグループ化し、それを参照します
$2
ファイルの2番目の変数として
/var/www/html/.htaccessRewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2
上記は、たとえば次のように変換されます。
http://example.com/pants/summer
に:
http://example.com/results.php?item=pants&season=summer
例1D:クエリ文字列の受け渡し
このセクションでは、新しい概念を紹介しませんが、発生する可能性のある問題に対処します。 上記の例を使用して、リダイレクトしたいとします http://example.com/pants/summer
ただし、追加のクエリ文字列を渡します ?page=2
. 以下をお願いします。
http://example.com/pants/summer?page=2
マップする場所:
http://example.com/results.php?item=pants&season=summer&page=2
現在の設定で上記のURLにアクセスしようとすると、クエリ文字列が見つかります page=2
迷った。 これは、追加のを使用して簡単に修正できます QSA
国旗。 以下に一致するように書き換えルールを変更すると、目的の動作が実現されます。
/var/www/html/.htaccessRewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]
例2:ロジックを使用した条件の追加
RewriteCond
書き換えルールに条件を追加しましょう。 全て RewriteCond
■次の形式に従います。
RewriteCond TestString Condition [Flags]
- RewriteCond :を指定します
RewriteCond
指令 - TestString :テストする文字列
- 条件:一致するパターン
- Flags :条件を変更する可能性のあるオプションのパラメーター
もし RewriteCond
真と評価され、 RewriteRule
直後が考慮されます。
例2A:デフォルトページ
架空の管理パネルでは、404でユーザーに挨拶するのではなく、すべての不正な形式のURLをホームページに戻すことができます。 条件を使用して、要求されたファイルが存在するかどうかを確認できます。
/var/www/html/.htaccessRewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^admin/(.*)$ /admin/home
これは次のようなものをリダイレクトします /admin/blargh
に /admin/home
.
上記で:
%{REQUEST_FILENAME}
チェックする文字列です!-f
を使用します!
ファイル名の演算子ではありませんRewriteRule
すべてのリクエストをにリダイレクトします/admin/home
より構文的および技術的に正しいアプローチは、404を定義することであることに注意してください。 ErrorDocument
.
/var/www/html/.htaccessErrorDocument 404 /error.html
例2B:IPアクセス制限
これは他の方法を使用して達成することもできますが、 RewriteCond
1つのIPまたはIPアドレスのコレクションへのアクセスを制限するために使用できます。
この例では、を除くすべての場所からのトラフィックをブロックします12.34.56.789。
/var/www/html/.htaccessRewriteCond %{REMOTE_ADDR} !^(12\.34\.56\.789)$
RewriteRule (.*) - [F,L]
この例は、古いmod_rewrite記事からの例3の否定です。 ステートメント全体には、「アドレスが not 12.34.56.789の場合は、アクセスを許可しないでください」と記載されています。
要するに:
%{REMOTE_ADDR}
アドレス文字列です!^(12\.34\.56\.789)$
すべてを逃れる.
期間\
バックスラッシュを使用してIPアドレスを無効にします!
- The
F
フラグはアクセスを禁止し、L
フラグは、実行された場合、これが実行される最後のルールであることを示します
ブロック12.34.56.789が必要な場合は、代わりに次を使用してください。
/var/www/html/.htaccessRewriteCond %{REMOTE_ADDR} ^(12\.34\.56\.789)$
RewriteRule (.*) - [F,L]
元の記事のパート1とパート2で、より多くの書き換えルールとホットリンクを防ぐ方法を見つけることができます。
結論
mod_rewrite
人間が読めるURLを確保するために効果的に使用できます。 The .htaccess
ただし、ファイル自体には、このモジュールだけでなく多くの用途があります。その機能を拡張するために、他の多くのApacheモジュールがインストールされている可能性があることに注意してください。
の機能を詳しく説明している他のリソースがあります mod_rewrite
:
mod_rewrite
はWebアプリケーションのセキュリティにとって重要なモジュールですが、リダイレクトループが発生したり、どこにでもある、あいまいな状態になることがあります。 500 forbidden
エラー。 デバッグのヒントについて .htaccess
、このStackOverflow投稿を参照してください。
書き換えルールは正規表現で記述されています。 エキスパートになるには、この正規表現に関するすべてのチュートリアルを参照してください。
正規表現パターンをすばやく分析するために、オンラインデバッガーを使用して、正規表現パターンの即時フィードバックとライブ解釈を提供できます。