mod_rewrite-ほぼ複雑

これは何ですか



mod_rewriteは、Apache Webサーバー用のモジュールで、URLを変換するように設計されています。 モジュールは、サーバー構成(httpd.conf)とサイトのファイル構造内の.htaccessファイルの両方で記述できる作業ルールで使用します。 ルールは正規表現PCREとして記述されます



ハローワールド



最も単純な例。 あなたのサイトがPHPで書かれていることを誰にも知られたくなくて、ファイル拡張子をマスクすることにしたとしましょう。 もちろん、Apache設定で適切なディレクティブを作成すると、拡張子が「.msl」(「My Super Language」)のすべてのファイルがPHPインタープリターによって処理されます。 しかし、もっと簡単にできます:

私たちのサイトのルートに次の内容の.htaccessファイルを作成します

RewriteEngine On

RewriteBase /

RewriteRule ^(.*)\.msl$ $1.php [QSA,L]








最初のディレクティブには、現在のフォルダーとそのすべてのサブフォルダーにmod_rewriteメカニズムが含まれています。 2番目は、ファイルシステム内の現在のフォルダーがサイトのルートに対応することをmod_rewriteに伝えます。 3番目はURL変換ルール自体です。



次のように読むことができます。

行の先頭( "^")の直後に任意の数の文字( "(。*)")があり、これらの文字が何であるかを正確に覚えたい場合は、角かっこで囲み、ピリオド( "\。")になります(エスケープします)単一のドットは任意の文字であるため)、文字は「msl」であり、行はそれで終わります(「$」)、元のURLを次のように置き換えます:ルールから角かっこで最初に記憶された部分文字列を取得し、「に追加します」 php "、可能性のあるすべての追加アドレスパラメータを追加" [QSA] "そしてここで終了、これ以上の適用は行いません mation彼らは"[L]"であれば



これで、「。php」で終わるすべてのリンクを「.msl」で安全に変更し、新しいスクリプト言語を考案したことをブログに書き込むことができます。 Apacheは、mod_rewriteを使用して「index.msl」へのリンクをオンザフライで満たし、「index.php」に変換して、目的のスクリプトを呼び出します。



mod_rewriteで他にできることは何ですか?



ああ、このモジュールは多くのことができます。 個人的には、魔法とPCREの上級者がmod_rewriteでSea Battleを書くのを待っています。



しかし、これが起こるまで、この素晴らしいモジュールを使用するためのいくつかのオプションを紹介します。



ブログエンジンを書くことにしたとしましょう。 各ユーザーは、自分のブログを作成し、名前を選択し、ブログに書き込み、他の人の投稿を読むことができます。



一次データのフィルタリング


ユーザーブログのアドレスの形式が「/ blogs / ABC /」であり、特定のブログのフィードを表示するスクリプトが「viewblog.php」と呼ばれるとします。

単純なmod_rewirteルールにより、攻撃者が使用できる無効なブログ名を除外できます。

RewriteRule blogs/([a-z0-9_-]+)([\/]{0,1})$ viewblog.php?blogname=$1 [L]

RewriteRule viewblog.php - [F]








PCRE構文に従って、角括弧で、数字、ラテン文字、マイナス記号、アンダースコアを含む文字クラスを指定します。 他の文字が存在するすべてのアドレスは、このルールによるテストに合格せず、エラー404になります。[L]フラグは、mod_rewriteエンジンが変換に成功した後、2番目のルールに進まないようにするために必要です。 このフラグは、ループ内のbreakステートメントに似ています。



2番目のルールはアドレス変換(「-」記号)を直接指定しませんが、viewblog.phpスクリプト(「[F]」フラグ)への直接アクセスを禁止するため、悪意のあるものをパラメーターに渡す機能をブロックします。



ところで:

あなたのルールは、ラインから良い音で始まります

RewriteRule .htaccess - [F]





これにより、ホストの構成が誤っている場合に.htaccessファイルにアクセスできなくなります。





FSでのキャッシュの使用法


プロジェクトが成長しているとします。 ホスティングは負荷に対処しなくなります-数百人のブロガー、数万人のブログのビュー、さらにはコメント...



また、何らかの理由でサーバーに切り替えたくない場合は、mod_rewriteが役立ちます。



まず、viewblog.phpスクリプトにアクセスして、生成されたページをブラウザに表示するだけでなく、/ blogs / ABC.htmlのファイルシステムに書き込むように、viewblog.phpスクリプトを変更します



これを行う最も簡単な方法は、バッファリング制御機能を使用することです。 viewblog.phpスクリプトのソースコードが次のようになっているとします。

<?php

$blogname = $_GET['blogname'];

if ( !Blogs::exists($blogname) )

die("No blog!");



Blogs::display($blogname);

?>








出力バッファリングを適用し、出力をファイルに書き込みます。

<?php

$blogname = $_GET['blogname'];

if ( !Blogs::exists($blogname) )

die("No blog!");



ob_start();

Blogs::display($blogname);

$content = ob_get_contents();

ob_end_flush();



$f = fopen(_YOUR_SITE_ROOT . "/blogs/" . $blogname . ".html", "w");

fwrite($f, $content);

fclose($f);

?>








.htaccessのルールをわずかに変更して、本格的なコンテンツキャッシュシステムを取得するだけです。



RewriteRule blogs\/([a-z0-9_-]+)([\/]{0,1})$ blogs\/$1\.html



RewriteCond %{REQUEST_FILENAME} blogs\/([a-z0-9_-]+)\.html$

RewriteCond %{REQUEST_FILENAME} !-s

RewriteRule (.*) viewblog.php?blogname=%1








最初の行では、blogs / ABC /という形式のURLをblogs / ABC.htmlに変換し、Apacheを生成したページキャッシュファイルにリダイレクトします。

次の3行は1つの大きなルールです。 ブログ/ ABC.htmlに対するリクエストがあり、ファイルシステムにそのようなファイルがない場合、リクエストはviewblog.phpスクリプトにリダイレクトされます



したがって、キャッシュをタイムリーにクリーニングするシステムのみを提供でき、問題は解決します。



その他の用途



個人的には、前の例と同様にmod_rewriteモジュールを使用して、FSで画像プレビューを生成および保存します。



mod_rewriteを使用してサブドメインをフォルダーにマップすることは非常に簡単です。たとえば、forum.localhost.localdomainは物理的にlocalhost.localdomain / forumに配置されます。これは、アプリケーション開発者にとっては簡単です。



mod_rewriteは、ファイルホスティングまたはデジタルグッズストアでのファイルダウンロードの制限(シンボリックリンクメカニズムを使用する必要があります)またはホットリンクの禁止(リファラーチェックによる)に不可欠です。



一般的に、これはブードゥー教です:)

おもしろいブードゥー教。毎日新しい側面やアプリケーションを発見できます。



他に読むものは何ですか?



httpd.apache.org/docs/2.2/mod/mod_rewrite.html

www.codenet.ru/webmast/php/mod_rewrite.php

www.egoroff.spb.ru/portfolio/apache/mod_rewrite.html

regexp.ru



All Articles