前書き
このチュートリアルでは、Apache2の `+ mod_rewrite +`モジュールを使用してURL書き換えを有効にし、管理する方法を学習します。 このツールを使用すると、URLをよりクリーンに書き換えて、人間が読み取れるパスをコードフレンドリーなクエリ文字列に変換できます。
このガイドは2つの部分に分かれています。1つ目はサンプルWebアプリケーションをセットアップし、2つ目は一般的に使用される書き換えルールを説明します。
前提条件
このチュートリアルを実行するには、次のものが必要です。
-
1つの新しいUbuntu 14.04ドロップレット
-
sudo非ルートユーザー。https://www.digitalocean.com/community/tutorials/how-to-add-and-delete-users-on-an-an-ubuntuのステップ2および3に従ってセットアップできます。 -14-04-vps [このチュートリアル]
ステップ1-Apacheのインストール
このステップでは、 `+ apt-get`と呼ばれる組み込みのパッケージインストーラーを使用します。 管理を大幅に簡素化し、クリーンインストールを促進します。
まず、システムのパッケージインデックスを更新します。 これにより、古いパッケージや古いパッケージがインストールを妨げないようにします。
sudo apt-get update
Apache2は前述のHTTPサーバーであり、世界で最も一般的に使用されています。 それをインストールするには、次を実行します。
sudo apt-get install apache2
最も人気のある2つのオープンソースWebサーバーであるNginxとApache2の違いについては、https://www.digitalocean.com/community/tutorials/apache-vs-nginx-practical-considerations [この記事]を参照してください。
ステップ2-mod_rewriteの有効化
ここで、 `+ mod_rewrite`を有効にする必要があります。
sudo a2enmod rewrite
これにより、モジュールがアクティブになるか、モジュールが既に有効になっていることを警告します。 これらの変更を有効にするには、Apacheを再起動します。
sudo service apache2 restart
ステップ3-.htaccessのセットアップ
このセクションでは、より簡単な書き換えルール管理のために `+ .htaccess +`ファイルをセットアップします。
`+ .htaccess `ファイルにより、サーバー設定ファイルにアクセスせずに書き換えルールを変更できます。 このため、Webアプリケーションのセキュリティにとって「 .htaccess +」は重要です。 ファイル名の前のピリオドにより、ファイルが非表示になります。
開始する前に、さらにいくつかの設定をセットアップして保護する必要があります。
最初に、 `+ .htaccess`ファイルの変更を許可します。 `+ nano +`またはお好みのテキストエディターを使用して、デフォルトのApache設定ファイルを開きます。
sudo nano /etc/apache2/sites-enabled/000-default.conf
そのファイル内で、1行目に `+ <VirtualHost *:80> +`ブロックがあります。 そのブロック内に、次のブロックを追加します。
/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 +`のみを_read_できるようにするには、次のコマンドを実行してパーミッションを更新します。
sudo chmod 644 /var/www/html/.htaccess
これで、Webアプリケーションのルーティングルールを管理するための、運用可能な `+ .htaccess`ファイルが作成されました。
ステップ4-ファイルのセットアップ
このセクションでは、きれいなURLを実際のコードへのパスに変換する基本的なURL書き換えを設定します。 具体的には、ユーザーが「+ / 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アプリケーションには、「+ / about.html」または「+ / about.html」からアクセスできます。 ここで、 `+ about.html`のみにアクセスできることに注意してください。 `+ / about`にアクセスしようとすると、* Not Found *エラーが表示されます。 代わりにユーザーに「+ 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]
おめでとうございます。 ブラウザで `+ / about +`にアクセスできるようになりました!
これは、すべての書き換えルールが従う一般的な構文を示す良い簡単な例です。
`+ ^ about $ +`はURLから一致する文字列です。 つまり、視聴者がブラウザに入力するものです。 この例では、いくつかの_メタ文字_を使用しています。
-
`+ ^ `は、 ` / +`が取り除かれた後のURLの開始を示します。
-
`+ $ +`はURLの終わりを示します
-
`+ about +`は文字列“ about”に一致します
`+ about.html `は、ユーザーがアクセスする実際のパスです。つまり、Apacheは引き続き ` about.html +`ファイルを提供します。
`+ [NC] +`は、URLの大文字化を無視する_flag_です。
上記のルールでは、次のURLは `+ about.html`を指します。
-
+ / about +
-
+ / About +
-
+ / about.html
以下はしません:
-
+ / about / +
-
+ / contact +
一般的なパターン
このセクションでは、一般的に使用されるいくつかのディレクティブを示します。
これでWebアプリケーションが実行され、保護された `+ .htaccess +`ファイルによって管理されます。 最も簡単な例は上記に含まれています。 このセクションでは、さらに2つの例を検討します。
必要に応じて、結果パスにサンプルファイルを設定できますが、このチュートリアルにはHTMLファイルとPHPファイルの作成は含まれません。書き換えのルールのみ。
例1:RewriteRuleによるクエリ文字列の簡素化
すべての + RewriteRule +
sは次の形式に従います。
RewriteRule pattern substitution [flags]
-
* RewriteRule *:ディレクティブ `+ RewriteRule +`を指定します
-
パターン:目的の文字列に一致する正規表現
-
* substitution *:実際のURLへのパス
-
* flags *:ルールを変更できるオプションのパラメーター
Webアプリケーションは、多くの場合、「クエリ文字列」を使用します。これは、「?」疑問符を使用してURLに追加され、「&」アンパサンドを使用して区切られます。 書き換えルールに一致する場合、これらは無視されます。 ただし、ページ間でデータを渡すためにクエリ文字列が必要になる場合があります。 たとえば、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
上記のルールは、「+ shirt / 」の後に指定されたシーズンが続くURLに一致します。 その季節は「()」を使用してグループ化され、その後のパスで「 $ 1 +」で参照されます。 これは、たとえば、次のことを意味します。
http://example.com/shirt/winter
になる:
http://example.com/results.php?item=shirt&season=winter
これにより、目的の効果も得られます。
例1C:一致する文字セット
しかし、 `+ / shirt +`のURLだけでなく、あらゆるタイプのアイテムを指定したいと思います。 そのため、次のことを行います。
-
すべての英数字に一致する正規表現を記述します。 角括弧式「+ [] 」はその中の任意の文字と一致し、「++」は角括弧で指定された任意の数の文字と一致します
-
一致をグループ化し、ファイルの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
to:
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 *:テスト対象の文字列
-
条件:一致するパターン
-
フラグ:条件を変更する可能性のあるオプションのパラメーター
`+ RewriteCond `がtrueと評価された場合、直後の ` RewriteRule +`が考慮されます。
例2A:デフォルトページ
架空の管理パネルでは、404でユーザーに挨拶する代わりに、すべての不正なURLをホームページに戻すことができます。 条件を使用して、要求されたファイルが存在するかどうかを確認できます。
/var/www/html/.htaccessRewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^admin/(.*)$ /admin/home
これにより、 `+ / admin / blargh `のようなものが ` / admin / home +`にリダイレクトされます。
上記で:
-
`+%{REQUEST_FILENAME} +`はチェックする文字列です
-
!-f +`はファイル名に `+!
not演算子を使用します -
+ 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]
この例は、単にhttps://www.digitalocean.com/community/tutorials/how-to-set-up-mod_rewrite-page-2 [古いmod_rewrite記事の例3]の否定です。 ステートメント全体には、「アドレスが_not_ 12.34.56.789の場合、アクセスを許可しない」と表示されます。
要するに:
-
`+%{REMOTE_ADDR} +`はアドレス文字列です
-
`!^(12 \ .34 \ .56 \ .789)$ +`はすべての `。`ピリオドを ` \ `バックスラッシュでエスケープし、 `!+`を使用してIPアドレスを無効にします
-
`+ F `フラグはアクセスを禁止し、 ` L +`フラグは、実行された場合、これが実行する最後のルールであることを示します
12.34.56.789を*ブロック*する場合は、代わりにこれを使用します。
/var/www/html/.htaccessRewriteCond %{REMOTE_ADDR} ^(12\.34\.56\.789)$
RewriteRule (.*) - [F,L]
オリジナルの記事のhttps://www.digitalocean.com/community/tutorials/how-to-set-up-mod_rewrite[part 1]およびhttps://で、より多くの書き換えルールとホットリンクを防ぐ方法を見つけることができます。 www.digitalocean.com/community/tutorials/how-to-set-up-mod_rewrite-page-2[part 2]。
結論
`+ mod_rewrite `は、人間が読めるURLを確保するために効果的に使用できます。 ただし、 ` .htaccess +`ファイル自体には、このモジュールよりも多くの用途があります。その機能を拡張するために、他の多くのApacheモジュールをインストールできることに注意してください。
`+ mod_rewrite +`の機能を詳述する他のリソースがあります:
`+ mod_rewrite `はWebアプリケーションのセキュリティにとって重要なモジュールですが、リダイレクトループや、ユビキタスで曖昧な `+500 forbidden +`エラーが発生する場合があります。 ` .htaccess +`のデバッグのヒントについては、http://stackoverflow.com/questions/9153262/tips-for-debugging-htaccess-rewrite-rules [このStackOverflowの投稿]を参照してください。
書き換えルールは正規表現で記述されます。 エキスパートになるには、https://www.digitalocean.com/community/tutorials/an-introduction-to-regular-expressions [正規表現に関するすべてのチュートリアル]を参照してください。
正規表現パターンをすばやく分析するためのhttps://regex101.com/ [オンラインデバッガー]は、正規表現パターンの即時のフィードバックとライブ解釈を提供します。