「きれいなリンク」はよくリクエストされるトピックですが、完全に説明されることはほとんどありません。 mod_rewrite は「きれいなリンク」を作成する 1 つの方法ですが、複雑で構文が非常に簡潔で理解しにくいため、ドキュメントは HTTP にある程度精通していることを前提としています。 「プリティ リンク」がどのように機能するのか、また mod_rewrite を使用してそれらを作成する方法を誰かが簡単に説明してもらえますか?
クリーン URL のその他の一般名、エイリアス、用語: RESTful URL、ユーザーフレンドリー URL、SEO フレンドリー URL、スラッギング、MVC URL (おそらく誤った呼び名)
deceze の回答を拡張するために、いくつかの例と他の mod_rewrite 機能の説明を提供したいと思います。 p>
以下のすべての例は、
.htaccess
ファイルにRewriteEngine On
が含まれていることを前提としています。書き換え例
例を挙げてみましょう:
リーリーこのルールは 4 つの部分に分かれています:
RewriteRule
- 書き換えルールを開始します^blog/([0-9] )/([A-Za-z0-9-\ ] )/?$
- これはパターンと呼ばれますが、単にパターンと呼ぶことにします。ルールの左側 - オーバーライドするものblog/index.php?id=$1&title=$2
- 置換と呼ばれる、または書き換えルールの右側 - 書き換えるコンテンツ[NC,L,QSA]
は書き換えルールのフラグであり、カンマで区切られています。詳しくは後ほど説明します上記の書き換えにより、
/blog/1/foo/
のようなものにリンクできるようになり、実際には/blog/index.php?id=1&title=foo 代码> が読み込まれます。 .
ルールの左側
はページ名の先頭を表します。したがって、
example.com/blog/...は書き換えられますが、
example.com/foo/ blog/ は書き換えられません。 ...括弧の各セットは正規表現を表し、ルールの右側の変数として取得できます。この例では:
最初の括弧のセット -- ([0-9] )
2 番目の括弧セットは、長さが 1 文字以上で、英数字 (A ~ Z、a ~ z、0 ~ 9) または
- -
- 長さが少なくとも 1 文字で、数値 (つまり 0-9) のみを含む文字列と一致します。これは、ルール
の右側にある$1
によって参照できます。または
(注 code>
バックスラッシュを使用してエスケープします。エスケープしないと、
正規表現の繰り返し文字) として表示されます。これは、ルールの右側にある$2
によって参照できます。は、前の文字がオプションであることを意味するため、この例では
/blog/1/foo/および
/blog/1/foocode>同じ場所に書き換えられます
###ロゴ###
no case フラグは、書き換えルールで大文字と小文字が区別されないことを意味します。したがって、上記のルール例では、これは
/blog/1/foo/および/BLOG/1/foo /# を意味します。 ## (またはそのバリエーション) が一致します。 リーリー
最後のフラグは、これが処理されるべき最後のルールであることを示します。これは、このルールが一致する場合に限り、現在の書き換え処理の実行ではそれ以上のルールは評価されないことを意味します。ルールが一致しない場合は、他のすべてのルールが通常どおり試行されます。L
Apache 2.4 以降では、フラグを設定しない場合、後続のすべてのルールが
rewriteURL に適用されます。
リーリー[END]
フラグは通常、サブディレクトリの書き換え時やサブディレクトリの書き換え時などに 2 番目のラウンドをトリガーします。)フラグも使用できます。これに一致するルールは、
完全にさらなるエイリアス/書き換え処理を終了します。 (また、[L]リーリー
クエリ文字列追加フラグを使用すると、指定された URL に追加の変数を渡すことができ、元の get パラメータに追加されます。この例では、
/blog/1/foo/?comments=15
のようなものが/blog/index.php?id=1&title=foo&comments=15
をロードすることを意味します。 リーリーこのフラグは上記の例で使用したものではありませんが、言及する価値があると思いました。これにより、http リダイレクトを指定し、オプションでステータス コード (例:
リーリーR=301
) を含めることができます。たとえば、/myblog/ から /blog/ への 301 リダイレクトを実行したい場合は、次のようなルールを記述するだけです:条件を書き換える
オーバーライド条件オーバーライドをより強力にし、より具体的な状況に合わせてオーバーライドを指定できるようにします。詳細についてはドキュメント中阅读很多条件> を参照してください。しかし、ここではいくつかの一般的な例を取り上げて説明します。 リーリー
これは非常に一般的な方法であり、ドメイン名の前にwww.
この状況はあまり一般的ではありませんが、ファイル名がサーバー上に存在するディレクトリまたはファイルである場合にルールが実行されない理由の良い例です。が追加され (まだ存在しない場合)、301 リダイレクトが実行されます。たとえば、
http://example.com/blog/を読み込むと、
http://www.example.com/blog/にリダイレクトされます。 リーリー
ファイル拡張子が jpg、jpeg、gif、または png のファイルのみが書き換えられます (大文字または小文字が書き換えられます)。鈍感になってください)。
現在のサーバーにファイルが存在するかどうかを確認し、存在しない場合は書き換えを実行します
現在のサーバーにファイルが存在するかどうかを確認し、存在しない場合は書き換えを実行します
mod_rewrite とは何かを理解するには、まず Web サーバーがどのように動作するかを理解する必要があります。 Web サーバーがHTTP リクエストに応答しました。最も基本的なレベルの HTTP リクエストは次のようになります:
リーリーこれは、ブラウザから Web サーバーへのURL
リーリー/foo/bar.html
に対する単純なリクエストです。filesを要求するのではなく、任意の URL を要求するだけであることを強調することが重要です。リクエストは次のようになります:これは URL リクエストと同様に機能し、明らかにファイルに依存しません。
Web サーバーは、ポートをリッスンし、そのポートから HTTP リクエストを受け入れ、応答を返すアプリケーションです。 Web サーバーは、適切と思われる方法であらゆるリクエストに完全に自由に応答したり、応答するように設定された方法で応答したりすることができます。この応答はファイルではなく、HTTP 応答であり、ディスク上の物理ファイルと関係がある場合とない場合があります。 Web サーバーは Apache である必要はありません。他にも多くの Web サーバーがあります。それらは永続的に実行され、HTTP リクエストに応答するポートに接続される単なるプログラムです。自分で書くこともできます。この段落の目的は、URL がファイルと直接同等であるという概念をなくすことです。これは理解することが非常に重要です。 :)
ほとんどの Web サーバーのデフォルト設定では、URL に一致するファイルをハードディスク上で検索します。サーバーのドキュメント ルートが
/var/www
に設定されている場合、サーバーはファイル/var/www/foo/bar.html
が存在する場合はそれを検索します。 . 提供してください。ファイルが「.php」で終わる場合、PHP インタープリターを呼び出して結果を返します。これらの関連付けはすべて完全に構成可能です。Web サーバーが PHP インタープリタを介してファイルを実行するためにファイルが「.php」で終わる必要はなく、何かが起こるために URL がディスク上の特定のファイルと一致する必要もありません。 。mod_rewriteは内部リクエスト処理を書き換えるメソッドです。 Web サーバーが URL
リーリー/foo/bar
のリクエストを受信すると、その URL を別の URL に書き換えることができ、Web サーバーはそれに一致するディスク上のファイルを検索します。簡単な例:このルールは、リクエストが「/foo/bar」に一致する限り、リクエストを「/foo/baz」に書き換えてくださいという意味です。リクエストは
このルールはあらゆるもの (/foo/baz のように処理されます。これは、次のようなさまざまな効果に使用できます。 リーリー
.*
リーリー) と一致し、
それをキャプチャし ((..))、それから ".html" " を追加するように書き換えます。つまり、リクエストされた URL が/foo/bar
である場合、/foo/bar.html
がリクエストされたものとして処理されます。 、http://正規表現.info
.を参照してください。よくあるもう 1 つのルールは次のとおりです:これもまた何かに一致し、それをファイルindex.phpに書き換えて、最初に要求されたURLを
urlクエリパラメータに追加します。つまり、受信するすべてのリクエストに対して、index.php ファイルが実行され、そのファイルは
Web サーバー構成ファイル$_GET['url']
内の元のリクエストにアクセスできるため、次のことが可能になります。それが望むものは何でもそれを使って何かをしてください。まず、これらの書き換えルールを
に追加します。 Apache では、*ドキュメント ルート (つまり、.php ファイルの隣) の.htaccessという名前のファイルにそれらを配置することもできます。
*メインの Apache 設定ファイルで許可されている場合はオプションですが、通常は有効になっています。
mod_rewriteは何もしません
mod_rewrite は魔法のようにすべての URL を「きれい」にするわけではありません。これはよくある誤解です。 Web サイトにこのリンクがある場合:
リーリーmod_rewrite ではきれいにできません。美しいリンクにするためには次のことを行う必要があります:
リンクを美しいリンクに変更します:
ああああ上記のいずれかの方法を使用して、サーバー上で mod_rewrite を使用して、URL
/my/pretty/link
に対するリクエストを処理します。(発信 HTML ページとそこに含まれるリンクの変換と組み合わせて
mod_substitute
を使用できます。ただし、これは通常、HTML リソースを更新するよりも手間がかかります。 )mod_rewrite は多くの機能を備えており、複数の書き換えの連鎖、完全に異なるサービスまたはマシンへのリクエストのプロキシ送信、応答として特定の HTTP ステータス コードを返す、リクエストのリダイレクトなど、非常に複雑な一致ルールを作成できます。これは非常に強力であり、基本的な HTTP リクエスト応答メカニズムを理解していれば非常に役立ちます。自動的にリンクが美しくなるわけではありません。
考えられるすべてのフラグとオプションについては、公式ドキュメントを参照してください。