1. ホーム
  2. apache

[解決済み] 参考:mod_rewrite、URLリライト、「プリティリンク」解説

2022-04-27 02:50:50

質問

きれいなリンクはよくリクエストされるテーマですが、十分に説明されていることはあまりありません。 mod_rewrite は、"pretty links" を作るひとつの方法ですが、これは複雑で、その構文は非常に簡潔で理解しにくく、ドキュメントではHTTPについてあるレベルの熟練度を想定しています。誰か、"pretty links" がどのように動作し、mod_rewrite がどのようにそれを作成するために使用できるのか、簡単な言葉で説明していただけませんか?

クリーンなURLの他の一般的な名前、エイリアス、用語。 RESTful URL、ユーザーフレンドリーなURL。 SEO -friendly URLs。 スラッギング と、MVCのURL(たぶん誤記)。

解決するには?

mod_rewrite が何をするのかを理解するために、まずウェブサーバがどのように動作するのかを理解する必要があります。ウェブサーバは次のように応答します。 HTTPリクエスト . 最も基本的なレベルのHTTPリクエストは、次のようになります。

GET /foo/bar.html HTTP/1.1

これは、ブラウザからウェブサーバへの単純なリクエストであり、そのリクエストは URL /foo/bar.html を送信します。を要求しないことを強調することが重要です。 ファイル これは任意のURLを要求するだけである。リクエストは次のようになることもあります。

GET /foo/bar?baz=42 HTTP/1.1

これはURLに対する要求と同じように有効であり、より明らかにファイルとは何の関係もありません。

Webサーバーは、あるポートで待ち受けるアプリケーションで、そのポートから入ってくるHTTPリクエストを受け付け、レスポンスを返します。Webサーバーは、どのようなリクエストに対しても、どのような方法で応答するか、どのような方法で応答するように設定するか、まったく自由です。このレスポンスはファイルではありません。 HTTPレスポンス これは、ディスク上の物理的なファイルとは関係ないかもしれません。ウェブサーバーは Apache である必要はなく、他の多くのウェブサーバーがあり、それらはすべて持続的に動作し、HTTP リクエストに応答するポートに接続された単なるプログラムです。自分で書くこともできます。このパラグラフは、URLが直接ファイルに等しいという概念からあなたを切り離すことを意図したもので、理解する上で本当に重要なことです :)

ほとんどのWebサーバーのデフォルトの設定は、ハードディスク上にあるURLと一致するファイルを探すことです。もし ドキュメントルート に設定されている場合、例えば、サーバーの /var/www というファイルがあるかどうかを調べることがあります。 /var/www/foo/bar.html が存在する場合、それを提供する。ファイルの末尾が ".php" である場合、PHP インタープリタを起動して では その結果を返す。この関連付けはすべて完全に設定可能です。WebサーバーがPHPインタープリターを介してファイルを実行するために、ファイルは".php"で終わる必要はありませんし、何かが起こるためにURLはディスク上の特定のファイルに一致する必要はありません。

mod_rewrite は リライト は、内部のリクエスト処理を行います。ウェブサーバがURLのリクエストを受けると /foo/bar を使用することができます。 リライト という URL を別のものに変えてから、ウェブサーバはそれにマッチするディスク上のファイルを探します。簡単な例です。

RewriteEngine On
RewriteRule   /foo/bar /foo/baz

このルールでは リクエストが "/foo/bar" にマッチするときはいつでも、それを "/foo/baz" に書き換えてください。 その後、リクエストは以下のように処理されます。 /foo/baz が代わりにリクエストされました。これは例えば様々な効果に利用することができます。

RewriteRule (.*) $1.html

このルールは、あらゆるもの ( .* ) と キャプチャ それ( (..) を追加するように書き換えています。つまり、もし /foo/bar がリクエストされたURLであった場合、それはあたかも /foo/bar.html が要求されていた。参照 http://regular-expressions.info は、正規表現のマッチング、キャプチャ、および置換についての詳細です。

また、よく遭遇するルールとして、こんなものがあります。

RewriteRule (.*) index.php?url=$1

これもまた、何かにマッチして、index.php ファイルに書き換えられ、元々リクエストされた URL が url クエリパラメータを指定します。つまり、入ってくるすべてのリクエストに対して、index.phpというファイルが実行され、このファイルは元のリクエストの $_GET['url'] だから、何でもできるんです。

主に、このリライトルールを ウェブサーバー設定ファイル . また、Apache では、これらのファイルを .htaccess をドキュメントルート内 (すなわち、.php ファイルの隣) に置いてください。

<サブ * もし は、Apache の主設定ファイルで許可されています; オプションですが、しばしば有効になります。

mod_rewrite が行うこと ではなく する

mod_rewrite は、魔法のようにすべての URL を "pretty"にするわけではありません。これはよくある誤解です。もしあなたのウェブサイトにこのようなリンクがあれば

<a href="/my/ugly/link.php?is=not&amp;very=pretty">

は、それをきれいにするために mod_rewrite ができることは何もありません。これをきれいなリンクにするためには、そうしなければなりません。

  1. リンクをプリティリンクに変更します。

    <a href="/my/pretty/link">
    
    
  2. サーバーで mod_rewrite を使用して、URL へのリクエストを処理します。 /my/pretty/link のいずれかを使用してください。

(を使用することができます。 mod_substitute を併用することで、発信するHTMLページとその中に含まれるリンクを変換することができます。ただし、これは通常、HTMLリソースを更新するよりも手間がかかります)。

mod_rewrite ができることはたくさんあり、いくつかの書き換えを連鎖させたり、 リクエストを全く別のサービスやマシンにプロキシしたり、 特定の HTTP ステータスコードをレスポンスとして返したり、 リクエストをリダイレクトしたりと、非常に複雑なマッチングルールを作成することができます。これは非常に強力で、基本的な HTTP リクエスト・レスポンス機構を理解していれば、非常に有効に使うことができます。その機能は ではない は、自動的にリンクをきれいにすることができます。

をご覧ください。 公式ドキュメント は、使用可能なすべてのフラグとオプションについて説明します。