「きれいなリンク」はよくリクエストされるトピックですが、完全に説明されることはほとんどありません。 mod_rewrite は「きれいなリンク」を作成する 1 つの方法ですが、複雑で構文が非常に簡潔で理解しにくいため、ドキュメントは HTTP にある程度精通していることを前提としています。 「プリティ リンク」がどのように機能するのか、また mod_rewrite を使用してそれらを作成する方法を誰かが簡単に説明してもらえますか?
クリーン URL のその他の一般名、エイリアス、用語: RESTful URL、ユーザーフレンドリー URL、SEO フレンドリー URL、スラッギング、MVC URL (おそらく誤った呼び名)
P粉2760641782023-10-21 11:08:48
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/ は書き換えられません。 ...
括弧の各セットは正規表現を表し、ルールの右側の変数として取得できます。この例では:
- 長さが少なくとも 1 文字で、数値 (つまり 0-9) のみを含む文字列と一致します。これは、ルール
の右側にある $1
によって参照できます。
または
(注 code> バックスラッシュを使用してエスケープします。エスケープしないと、
正規表現の繰り返し文字 ) として表示されます。これは、ルール の右側にある $2
によって参照できます。
は、前の文字がオプションであることを意味するため、この例では
/blog/1/foo/ および
/blog/1/foo code>同じ場所に書き換えられます
###ロゴ###
および /BLOG/1/foo /# を意味します。 ## (またはそのバリエーション) が一致します。 < /a> リーリー
最後のフラグは、これが処理されるべき最後のルールであることを示します。これは、このルールが一致する場合に限り、現在の書き換え処理の実行ではそれ以上のルールは評価されないことを意味します。ルールが一致しない場合は、他のすべてのルールが通常どおり試行されます。L フラグを設定しない場合、後続のすべてのルールが
rewrite URL に適用されます。
リーリー
[END] フラグも使用できます。これに一致するルールは、
完全に さらなるエイリアス/書き換え処理を終了します。 (また、[L]
リーリー
クエリ文字列追加フラグを使用すると、指定された URL に追加の変数を渡すことができ、元の get パラメータに追加されます。この例では、/blog/1/foo/?comments=15
のようなものが /blog/index.php?id=1&title=foo&comments=15
< /p> をロードすることを意味します。
リーリー
このフラグは上記の例で使用したものではありませんが、言及する価値があると思いました。これにより、http リダイレクトを指定し、オプションでステータス コード (例: R=301
) を含めることができます。たとえば、/myblog/ から /blog/ への 301 リダイレクトを実行したい場合は、次のようなルールを記述するだけです:
オーバーライド条件オーバーライドをより強力にし、より具体的な状況に合わせてオーバーライドを指定できるようにします。詳細については ドキュメント を参照してください。しかし、ここではいくつかの一般的な例を取り上げて説明します。 リーリー
これは非常に一般的な方法であり、ドメイン名の前にwww. が追加され (まだ存在しない場合)、301 リダイレクトが実行されます。たとえば、
http://example.com/blog/ を読み込むと、
http://www.example.com/blog/ にリダイレクトされます。
リーリー
ファイル拡張子が jpg、jpeg、gif、または png のファイルのみが書き換えられます (大文字または小文字が書き換えられます)。鈍感になってください)。
現在のサーバーにファイルが存在するかどうかを確認し、存在しない場合は書き換えを実行します
現在のサーバーにファイルが存在するかどうかを確認し、存在しない場合は書き換えを実行します
P粉0221405762023-10-21 00:43:03
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<相反,已请求 /code> のように処理されます。これは、次のようなさまざまな効果に使用できます。
リーリー
.*) と一致し、
それをキャプチャし ((..))、それから ".html" " を追加するように書き換えます。つまり、リクエストされた URL が /foo/bar
である場合、/foo/bar.html
がリクエストされたものとして処理されます。 、http://正規表現.info
.を参照してください。
よくあるもう 1 つのルールは次のとおりです:
これもまた何かに一致し、それをファイルindex.phpに書き換えて、最初に要求されたURLを
urlクエリパラメータに追加します。つまり、受信するすべてのリクエストに対して、index.php ファイルが実行され、そのファイルは $_GET['url']
内の元のリクエストにアクセスできるため、次のことが可能になります。それが望むものは何でもそれを使って何かをしてください。
まず、これらの書き換えルールを
に追加します。 Apache では、*ドキュメント ルート (つまり、.php ファイルの隣) の .htaccess という名前のファイルにそれらを配置することもできます。
メインの Apache 設定ファイルで許可されている場合はオプションですが、通常は有効になっています。 mod_rewrite は魔法のようにすべての URL を「きれい」にするわけではありません。これはよくある誤解です。 Web サイトにこのリンクがある場合: mod_rewrite ではきれいにできません。美しいリンクにするためには次のことを行う必要があります: リンクを美しいリンクに変更します: 上記のいずれかの方法を使用して、サーバー上で mod_rewrite を使用して、URL (発信 HTML ページとそこに含まれるリンクの変換と組み合わせて mod_rewrite は多くの機能を備えており、複数の書き換えの連鎖、完全に異なるサービスまたはマシンへのリクエストのプロキシ送信、応答として特定の HTTP ステータス コードを返す、リクエストのリダイレクトなど、非常に複雑な一致ルールを作成できます。これは非常に強力であり、基本的な HTTP リクエスト応答メカニズムを理解していれば非常に役立ちます。 自動的にリンクが美しくなるわけではありません。
公式ドキュメント を参照してください。 mod_rewriteは何もしません
/my/pretty/link
に対するリクエストを処理します。 mod_substitute
< /a> を使用できます。ただし、これは通常、HTML リソースを更新するよりも手間がかかります。 )