検索

ホームページ  >  に質問  >  本文

説明: mod_rewrite、URL 書き換え、「きれいなリンク」の作成について理解する

「きれいなリンク」はよくリクエストされるトピックですが、完全に説明されることはほとんどありません。 mod_rewrite は「きれいなリンク」を作成する 1 つの方法ですが、複雑で構文が非常に簡潔で理解しにくいため、ドキュメントは HTTP にある程度精通していることを前提としています。 「プリティ リンク」がどのように機能するのか、また mod_rewrite を使用してそれらを作成する方法を誰かが簡単に説明してもらえますか?

クリーン URL のその他の一般名、エイリアス、用語: RESTful URL、ユーザーフレンドリー URL、SEO フレンドリー URL、スラッギング、MVC URL (おそらく誤った呼び名)

P粉501007768P粉501007768402日前770

全員に返信(2)返信します

  • P粉276064178

    P粉2760641782023-10-21 11:08:48

    deceze の回答 を拡張するために、いくつかの例と他の mod_rewrite 機能の説明を提供したいと思います。

    以下のすべての例は、.htaccess ファイルに RewriteEngine On が含まれていることを前提としています。

    書き換え例

    例を挙げてみましょう:

    リーリー

    このルールは 4 つの部分に分かれています:

    1. RewriteRule - 書き換えルールを開始します
    2. ^blog/([0-9] )/([A-Za-z0-9-\ ] )/?$ - これはパターンと呼ばれますが、単にパターンと呼ぶことにします。ルールの左側 - オーバーライドするもの
    3. blog/index.php?id=$1&title=$2 - 置換と呼ばれる、または書き換えルールの右側 - 書き換えるコンテンツ
    4. [NC,L,QSA] は書き換えルールのフラグであり、カンマで区切られています。詳しくは後ほど説明します

    上記の書き換えにより、/blog/1/foo/ のようなものにリンクできるようになり、実際には /blog/index.php?id=1&title=foo が読み込まれます。 .

    ルールの左側

    • #^ はページ名の先頭を表します。したがって、example.com/blog/... は書き換えられますが、example.com/foo/ blog/ は書き換えられません。 ...
    • (…) 括弧の各セットは正規表現を表し、ルールの右側の変数として取得できます。この例では:
        最初の括弧のセット -
      • ([0-9] ) - 長さが少なくとも 1 文字で、数値 (つまり 0-9) のみを含む文字列と一致します。これは、ルール の右側にある $1 によって参照できます。
      • 2 番目の括弧セットは、長さが 1 文字以上で、英数字 (A ~ Z、a ~ z、0 ~ 9) または
      • - または (注 バックスラッシュを使用してエスケープします。エスケープしないと、正規表現の繰り返し文字 ) として表示されます。これは、ルール の右側にある $2 によって参照できます。
    • ? は、前の文字がオプションであることを意味するため、この例では /blog/1/foo/ および /blog/1/foo code>同じ場所に書き換えられます
    • ##$
    • は、これが照合する文字列の終わりであることを意味します ###ロゴ###
    • これらのオプションは、特定の条件を指定するために書き換えルールの最後に角かっこ内に追加されます。繰り返しになりますが、
    ドキュメントにはさまざまなフラグがたくさんありますが、より一般的なフラグのいくつかについて説明します。 リーリー

    no case フラグは、書き換えルールで大文字と小文字が区別されないことを意味します。したがって、上記のルール例では、これは

    /blog/1/foo/

    および /BLOG/1/foo /# を意味します。 ## (またはそのバリエーション) が一致します。 < /a> リーリー

    最後のフラグは、これが処理されるべき最後のルールであることを示します。これは、このルールが一致する場合に限り、現在の書き換え処理の実行ではそれ以上のルールは評価されないことを意味します。ルールが一致しない場合は、他のすべてのルールが通常どおり試行されます。

    L フラグを設定しない場合、後続のすべてのルールが rewrite URL に適用されます。 リーリー

    Apache 2.4 以降では、

    [END] フラグも使用できます。これに一致するルールは、完全に さらなるエイリアス/書き換え処理を終了します。 (また、[L]

    フラグは通常、サブディレクトリの書き換え時やサブディレクトリの書き換え時などに 2 番目のラウンドをトリガーします。)

    リーリー

    クエリ文字列追加フラグを使用すると、指定された 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/ にリダイレクトされます。 リーリー

    この状況はあまり一般的ではありませんが、ファイル名がサーバー上に存在するディレクトリまたはファイルである場合にルールが実行されない理由の良い例です。

    • %{REQUEST_URI} \.(jpg|jpeg|gif|png)$ [NC] ファイル拡張子が jpg、jpeg、gif、または png のファイルのみが書き換えられます (大文字または小文字が書き換えられます)。鈍感になってください)。
    • %{REQUEST_FILENAME} !-f 現在のサーバーにファイルが存在するかどうかを確認し、存在しない場合は書き換えを実行します
    • %{REQUEST_FILENAME} !-d 現在のサーバーにファイルが存在するかどうかを確認し、存在しない場合は書き換えを実行します
    • 書き換えにより、同じファイルを別のドメインにロードしようとします
    • 返事
      0
  • P粉022140576

    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'] 内の元のリクエストにアクセスできるため、次のことが可能になります。それが望むものは何でもそれを使って何かをしてください。 まず、これらの書き換えルールを

    Web サーバー構成ファイル

    に追加します。 Apache では、*ドキュメント ルート (つまり、.php ファイルの隣) の .htaccess という名前のファイルにそれらを配置することもできます。

    *

    メインの Apache 設定ファイルで許可されている場合はオプションですが、通常は有効になっています。

    mod_rewriteは何もしません

    mod_rewrite は魔法のようにすべての URL を「きれい」にするわけではありません。これはよくある誤解です。 Web サイトにこのリンクがある場合:

    リーリー

    mod_rewrite ではきれいにできません。美しいリンクにするためには次のことを行う必要があります:

    1. リンクを美しいリンクに変更します:

      ああああ
    2. 上記のいずれかの方法を使用して、サーバー上で mod_rewrite を使用して、URL /my/pretty/link に対するリクエストを処理します。

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

    mod_rewrite は多くの機能を備えており、複数の書き換えの連鎖、完全に異なるサービスまたはマシンへのリクエストのプロキシ送信、応答として特定の HTTP ステータス コードを返す、リクエストのリダイレクトなど、非常に複雑な一致ルールを作成できます。これは非常に強力であり、基本的な HTTP リクエスト応答メカニズムを理解していれば非常に役立ちます。 自動的にリンクが美しくなるわけではありません。

    考えられるすべてのフラグとオプションについては、

    公式ドキュメント を参照してください。

    返事
    0
  • キャンセル返事