mod_rewriteの実際の動作方法。 継続ガイド

画像

この記事は、テクニカルサポートスタッフがmod_rewriteを操作するための高度なトレーニングのアイデアから生まれました。 実践により、ロシア語の多数の教科書で利​​用できるように勉強した後、テンプレートの問題を解決するためにサポートがうまく機能することが示されていますが、試行錯誤とルールの自己コンパイルが発生します。 問題は、mod_rewriteの操作を十分に理解するには、元の英語のドキュメントを学習する必要があることです。その後、追加の説明またはRewriteLogを使用した数時間の実験が必要です。



この記事では、mod_rewriteの動作メカニズムについて説明しています。 操作の原理を理解することにより、各ディレクティブの効果を明確に理解し、ディレクティブを処理するときにmod_rewrite内で何が起こるかを明確に想像することができます。



読者はmod_rewriteが何であるかを既に知っていると思いますが、インターネットで簡単に見つけられる基本を説明しません。 また、この記事では、.htaccessファイルでディレクティブを使用する場合のmod_rewriteの作業に焦点を当てていることに注意してください。 <VirtualHost>のコンテキストで作業する場合の違いについては、記事の最後に概説します。



そのため、mod_rewriteを研究し、いくつかのRewriteRuleをコンパイルして、何らかの理由でルールがリクエストをキャッチしない場合、および次のルールが予期せずにリクエストを変更する場合、前のルールによって準備された、予期せぬ動作により、無限リダイレクトに遭遇しました。



なぜこれが起こっているのですか?



RewriteRuleは何と連携しますか



最初のRewriteRuleには、.htaccessがある場所から要求されたファイルへのパスが渡されます。 この行は「/」で始まることはありません。 後続のRewriteRuleは、以前の変換の結果を渡します。



RewriteRuleがどのように機能するかを完全に理解するには、最初にRewriteRuleの動作を決定する必要があります。 .htaccessでRewriteRuleに最初に渡される文字列をApacheがどのように受け取るかを検討してください。



mod_rewriteを初めて使用するときは、論理的にリンクで機能すると想定しています。 ただし、.htaccessでmod_rewriteを使用する場合はそうではありません。 実際、 リンクはRewriteRule 渡されませんが、要求されたファイルへのパスが渡されます



.htaccessが有効になる時点のApacheの内部アーキテクチャにより、mod_rewriteは処理するファイルへのパスでのみ動作できます。 これは、mod_rewriteに転送する前に、他のモジュール(mod_aliasなど)によって要求が変更され、サイト上のファイルへの最終パスが元のリンクと一致しなくなる可能性があるためです。 mod_rewriteが元のリンクで機能する場合、それより前にリクエストを変更したモジュールのアクションに違反します。



したがって、処理されるファイルへの絶対パスはmod_rewriteに渡されます。 また、mod_rewriteは、RewriteRuleルールを含む.htaccessへのパスを認識しています。 ファイルパスを、サイト開発者が作業する予定のリンクに似たものにするために、mod_rewriteは、.htaccessファイルへの絶対パスからパーツを切り取ります。



したがって、最初のRewriteRuleに渡されるのは、.htaccessへのパスが切断されるこのパスです。 例:

RewriteRuleの仕組み






.htaccessへのパスは、スラッシュとともに切断されます。 この結果があります。処理のためにRewriteRuleに最初に渡される行は、「/」で始まることはありません。



RewriteRuleにはないことを覚えておくことが重要です。 サイトの名前、スクリプトに渡される引数は処理されません。また、.htaccessがサイトのルートにない場合、リンク全体は処理されません。 これらはすべてRewriteCondによって行われます。RewriteCondについては、少し後で簡単に触れます。 だから:



# - /

RewriteRule ^/index.php$ /my-index.php



# - RewriteRule

RewriteRule ^example.com/.* http://www.example.com



# - RewriteRule

RewriteRule index.php\?newspage=([0-9]+) news.php?page=$1



# .htaccess , templates,

# , . , .htaccess templates/.htaccess ,

# , mod_rewrite .htaccess RewriteRule

# "templates/"

RewriteRule ^templates/common/yandex-money.gif$ templates/shared/yad.gif








mod_rewriteの使用開始時には、サイトのルートにある.htaccessでのみ作業することをお勧めします。 これにより、彼の作業の制御が多少簡単になります。



RewriteRuleがどのように機能するかを把握しました。 それでは、その仕組みを見てみましょう。



RewriteRuleの仕組み



RewriteRuleは、正規表現に従って文字列を変換するだけです。 RewriteRuleは、ファイルへのリンクやパスではなく、文字列で機能します。



上記で確認したように、.htaccessから要求されたファイルへのパスはRewriteRule入力に到達します。 現在最も便利な方法は、パスとリンクを無視し、RewriteRule が通常の文字列として機能するものを考慮することです。 この文字列はRewriteRuleからRewriteRuleに渡され、RewriteRuleのいずれかが機能した場合は変更されます。



一般的に、フラグの使用の難しさ(以下で説明します)と正規表現のコンパイルの難しさ(この記事ではほとんど触れません)を除外すると、RewriteRuleは非常に簡単に機能します。

  1. 私たちは列になりました。
  2. 最初の引数の正規表現と比較してください。
  3. 一致する場合は、 文字列全体を 2番目の引数の値に置き換えます。
  4. 次のRewriteRuleに行を渡しました。
それは、一般に、すべてです。 RewriteRule が文字列で機能することを明確に示すために、次の素晴らしい例を考えてみましょう。



# : http://mysite.com/info.html

# RewriteRule "info.html"



# .

RewriteRule ^info.html$ "I saw a turtle in the hole. And it was dancing rock-n-roll. And it was smiling. All in all, it was a very funny doll."



# "info.html" -> "I saw a turtle..."



# .

RewriteRule turtle https://example.com/information/index.html



# "I saw a turtle..." -> "https://example.com/information/index.html"



# !

RewriteRule ^(.*)example.com(.*)$ $1example.org$2



# "https://example.com/information/index.html" -> "https://example.org/information/index.html"



# !

RewriteRule ^https:(.*)$ ftp:$1



# "https://example.org/information/index.html" -> "ftp://example.org/information/index.html"



# .

RewriteRule ^(.*)/index.html$ $1/main.php



# "ftp://example.org/information/index.html" -> "ftp://example.org/information/main.php"








ご覧のとおり、RewriteRuleは何を扱うかを気にしません。指定された引数に従って文字列を変換するだけです。 必要に応じて、任意のデータを1行に格納できます。必要に応じて、忍耐と正規表現の十分な知識があれば、少なくともRewriteRuleにtic-tac-toeを書くことができます。



ここで、発言する必要があります。RewriteRuleはクリーンな行で動作しますが、それでもリンクの操作を指向しています。 したがって、「https://」または類似語(外部リダイレクトを作成したいことを思い出してください)で始まる行と記号「?」に特別な方法で反応します。 (リクエストの代わりに使用する必要がある引数として、次の文字を考慮します)。 ただし、これは今では興味の対象ではありません。RewriteRuleには魔法がないことを理解することが重要です。 外部リダイレクトと引数については記事の後半で検討しますが、そこについても話をする必要があります。



すべての変換が完了し、最後のRewriteRuleが完了すると、RewriteBaseが有効になります。



RewriteBaseとは何ですか?



変換後に取得されたクエリが相対的で、元のクエリと異なる場合、RewriteBaseは左側のクエリに自分自身を追加します。 必ず.htaccessでRewriteBaseを指定してください。 その意味は、サイトのルートから.htaccessへのパスです。

RewriteBaseは、すべてのRewriteRuleの後でのみ実行され、それらの間ではありません。



.htaccessで動作するmod_rewriteは、要求されたファイルへの絶対パスを取得することを既に述べました。 RewriteRuleに渡すために、mod_rewriteは.htaccessへのパスを切り取ります。 次に、RewriteRuleルールはリクエストを1つずつ変更します。 そして今、リクエストが変更された後、Apacheはファイルへの絶対パスを復元し、最終的に処理する必要があります。 RewriteBaseは実際には、ファイルへの元のパスを復元するのに役立つハックです。



RewriteBaseは、すべての変換後に実行されます。 つまり、RewriteRule間のリクエストは変更されませんが、すべてのRewriteRuleが完了したときにのみ有効になります。



すべての変換後、RewriteBaseは、相対パスが最終パスまたは絶対パスであることを確認します。 Apacheのコンテキストでは、サイトのルートから数えた相対パスまたは絶対パスを意味します。

パスが絶対パスの場合、RewriteBaseは何もしません。 相対的な場合-RewriteBaseはそれ自体を左に追加します。 これは、内部リダイレクトと外部リダイレクトの両方で機能します。



# .htaccess /images/

# RewriteBase /images/

RewriteBase /images/



# http://example.com/images/logo.gif

# RewriteRule "logo.gif"

RewriteRule ^logo.gif$ logo-orange.gif

# RewriteRule: "logo.gif" -> "logo-orange.gif"

# RewriteBase: "logo-orange.gif" -> "/images/logo-orange.gif"



# http://example.com/images/header.png

# RewriteRule "header.png"

RewriteRule ^header.png$ /templates/rebranding/header.png

# RewriteRule: "header.png" -> "/templates/rebranding/header.png"

# RewriteBase: , "/'.



# http://example.com/images/director.tiff

# RewriteRule "director.tiff"

#

RewriteRule ^director.tiff$ staff/manager/director.tiff [R=301]

# RewriteRule: "director.tiff" -> "staff/manager/director.tiff"

# + mod_rewrite ,

# RewriteBase: "staff/manager/director.tiff" -> "/images/staff/manager/director.tiff"

# mod_rewrite :

# "/images/staff/manager/director.tiff" -> http://example.com/images/staff/manager/director.tiff








通常、mod_rewriteに慣れた後、次の習慣が発達します。1)各.htaccessに「RewriteBase /」を追加し、2)スラッシュからすべてのリダイレクトを開始します:「RewriteRule news.php /index.php?act=news」。 これはRewriteBaseアーティファクトを取り除くのに役立ちますが、そうするのは間違っています。 RewriteBaseの機能がわかったので、次の正しいルールを定式化できます。

  1. RewriteBaseは、サイトルートから.htaccessへのパスと一致する必要があります。
  2. サイトルートからファイルへの絶対パスを指定する必要がある場合にのみ、「/」でリダイレクトを開始する必要があります。


RewriteBaseの仕組み






RewriteBaseを指定しないとどうなりますか? デフォルトでは、Apacheはファイルシステム上の.htaccessへの絶対パス(例:/var/www/example.com/templates/)に等しくします。 Apacheによるこの仮定の不正確さは、外部相対リダイレクトで明らかになります。

# http://example.com/index.php

# DocumentRoot: /var/www/example.com/

# .htaccess , RewriteBase.

# RewriteBase .htaccess: /var/www/example.com/



# RewriteRule - "index.php"

RewriteRule ^index.php main.php [R]

# : "index.php" -> "main.php"

# mod_rewrite ,



# RewriteRule

# mod_rewrite RewriteBase, .

# : "main.php" -> "/var/www/example.com/main.php"



# mod_rewrite , :

# "/var/www/example.com/main.php" -> http://example.com/var/www/example.com/main.php



# , .








そのため、要求はすべてのRewriteRuleを通過し、その後、必要に応じてRewriteBaseが追加されました。 Apacheは、結果のパスが指すファイルを提供する必要がありますか? いや これで、結果のリクエストが再び処理されます。



mod_rewriteの仕組み フラグ[L]



mod_rewriteは、変更が停止するまで、要求の処理を何度も開始します。 そして、フラグ[L]はそれを止めることはできません。



多少複雑なmod_rewrite構成をコンパイルする場合、リクエストの変更が最後のRewriteRuleで終了しないことを理解することが重要です 。 最後のRewriteRuleルールが機能し、RewriteBaseが追加された後、mod_rewriteは要求が変更されたかどうかを確認します。 要求が変更された場合、その処理は.htaccessの先頭から新たに開始されます。



Apacheがこれを行うのは、リクエストを変更するプロセスで、リクエストが別のディレクトリにリダイレクトされる可能性があるためです。 以前のリクエスト処理に参加しなかった独自の.htaccessを持つ場合があります。 同じ新しい.htaccessには、リクエストの処理に影響するルールがあります-mod_rewriteルールと他のモジュールのルールの両方。 この状況を正しく処理するには、Apacheは処理サイクル全体を再起動する必要があります。



-待ってください。ただし、リクエスト[mod_rewrite'om! ]の処理を停止するフラグ[L]があります。



あまり好きではありません。 [L]フラグは、要求処理の現在の反復を停止します 。 ただし、リクエストがまだうまく機能しているRewriteRuleによって変更された場合、Apacheは最初のRewriteRuleからリクエスト処理サイクルを再び開始します。

# : http://example.com/a.html



RewriteBase /



RewriteRule ^a.html$ b.html [L]

RewriteRule ^b.html$ a.html [L]








上記の例では、リダイレクトの無限ループが発生し、最終的に「内部サーバーエラー」が発生します。 この例では、無限ループは明らかですが、より複雑な構成では、どの要求がループしているのかを判断するためにルールを掘り下げる必要があります。



このような状況を回避するには、必要な場合にのみ[L]フラグを使用することをお勧めします。 必要性には2つのタイプがあります。

  1. 外部リダイレクトが使用される場合-[L、R = 301]または[L、R = 302]。 外部リダイレクトの場合、リクエストをさらに処理することは望ましくなく(以下の[R]フラグを参照)、停止することをお勧めします。
  2. 削除できないループが.htaccessにあり、mod_rewriteによるリクエストの処理を強制的に停止する必要がある場合。 この場合、特別な設計が使用されます-記事の最後にあるこのトピックに関するヒントを参照してください。


ただし、以下の例はサイクルにはなりません。 理由と、最終的にどのファイルがApacheに返されるかを判断してください。

# : http://example.com/a.html

# .htaccess



RewriteBase /

RewriteRule ^a.html$ b.html

RewriteRule ^b.html$ a.html



# .htaccess








推測: すべてのRewriteRuleを実行した結果、最終結果が元の結果と等しくなるようにリクエストが変更されます。 Apacheはこれを認識し、リクエストの再処理を開始しませんa.htmlファイルが返されます。



mod_rewriteの仕組み フラグ[R]



[R]フラグは要求の処理を停止せず、外部リダイレクトをすぐに返します。 代わりに、外部リダイレクトの必要性を覚えており、要求処理は次のRewriteRuleで続行されます。 [L]フラグを使用することを常にお勧めします。



[R]フラグは、内部リダイレクトではなく外部リダイレクトを実行する必要があることをApacheに伝えます。 外部リダイレクトと内部リダイレクトの違いは何ですか? 内部リダイレクトは、ユーザーに与えられるファイルへのパスを変更するだけですが、ユーザーは、最初に要求したファイルを受け取ると信じています。 外部リダイレクトでは、Apacheはファイルのコンテンツの代わりに、301または302の応答ステータスをユーザーに返し、ブラウザがファイルを受信するために使用する必要があるリンクを報告します。



[R]フラグを処理するとき、ApacheはすぐにRewriteRuleの処理を停止し、ユーザーに外部リダイレクトを返すように思われます。 ただし、「RewriteRuleの仕組み」セクションから素晴らしい例を思い出してみましょう。 その中で、最初に外部リダイレクトの必要性を示す[R]フラグを示し、その後、次のRewriteRuleでリンクを変更し続けました。



これは、外部リダイレクトを指定するときのApacheの動作とまったく同じです。 彼は、すべてのルールが実行された後、ステータス302(デフォルト)を返す必要があることを自分自身に「マーク」しますが、同時にリストの下のすべてのRewriteRuleを実行し続けます。 必要に応じてリクエストを変更し続けることができますが、うまくいかないのはリダイレクトを内部に戻すことだけです。



ただし、外部リダイレクトを与えた後に何らかの方法で変更することはほとんどありません。 したがって、 フラグ[R]を[L]とともに使用することをお勧めします。



# BlackJack

RewriteRule ^bj/(.*) blackjack/$1 [R=301,L]



#

RewriteRule ^bj/(.*) http://blackjack.example.com/$1 [L]








[R]フラグを使用する代わりに、外部リンクを指定するだけです。 この場合、Apacheは外部リダイレクトを行う必要があると推測します。 ここでは、[R]フラグの明示的な指示の場合と同様に、[L]フラグを使用することをお勧めします。



mod_rewriteの仕組み 要求パラメーターとフラグの表示[QSA]



RewriteRuleの要求パラメーターを変更しても、次のRewriteRuleが機能する行は変更されません。 ただし、パラメーターを変更すると、変数%{QUERY_STRING}が変更され、RewriteCondを使用できます。



使用される用語:「パラメーター」-クエリパラメーター、「引数」-RewriteRule引数。



RewriteRuleを使用すると、処理されるファイルへのパスだけでなく、ファイルに渡されるGETリクエストのパラメーターも変更できます。 これは、CNC処理を一般的なスクリプトハンドラーに渡すためによく使用されます。例:

RewriteBase /



# : http://example.com/news/2010/07/12/grand-opening.html

# : "news/2010/07/12/grand-opening.html"

RewriteRule ^news/(.*)$ index.php?act=news&what=$1

# RewriteRule: "news/2010/07/12/grand-opening.html" -> "index.php"

# %{QUERY_STRING}: "" -> "act=news&what=2010/07/12/grand-opening.html"








RewriteRuleルールが2番目の引数に疑問符を見つけた瞬間、リクエストのパラメーターに変更があることを理解します。 その結果、次のことが発生します。

  1. RewriteRuleは、 疑問符の前の 2番目の引数の部分で動作する行を置き換えます。 新しいクエリパラメータ 、後続のRewriteRuleルールが機能する文字列に該当ないことに注意してください。
  2. 疑問符の後の2番目の引数の部分は、変数%{QUERY_STRING}に分類されます。 [QSA]フラグが指定された場合、クエリパラメータは%{QUERY_STRING}の先頭に追加されます。 フラグが指定されなかった場合、%{QUERY_STRING}はRewriteRuleのクエリパラメーターに完全に置き換えられます。
さらにいくつかの例:

RewriteBase /



# : http://example.com/news/2010/?page=2

# RewriteRule: "news/2010/"

RewriteRule ^news/(.*)$ index.php?act=news&what=$1

# : "news/2010/" -> "index.php"

# %{QUERY_STRING}: "page=2" -> "act=news&what=2010/"








ほとんどの場合、ページ引数が失われるため、上記のルールは正しく機能しません。 これを修正しましょう:

RewriteBase /



# : http://example.com/news/2010/?page=2

# RewriteRule: "news/2010/"

RewriteRule ^news/(.*)$ index.php?act=news&what=$1 [QSA]

# : "news/2010/" -> "index.php"

# %{QUERY_STRING}: "page=2" -> "act=news&what=2010/&page=2"








[QSA]フラグのみを追加し、ルールが正しく機能するようになりました。



クエリパラメータを変更すると、%{QUERY_STRING}が変更され、後でRewriteCondで使用できることを理解することが重要です。 これは、引数をテストする後続のルールを作成するときに考慮に入れる必要があります。



-もちろん、リクエストはApache'mを再処理するため、変更されます!



いいえ、%{QUERY_STRING} はすぐに変更されます。 私は証明をしません-読むのが面白いよりも多くのパラメータについてはすでに書かれています:)



RewriteCondで、RewriteRulesによって変更されていない、ユーザーが渡した要求パラメーターを正確にチェックインするにはどうすればよいですか? 記事の最後にあるヒントをご覧ください。



RewriteCondとパフォーマンス



最初に、要求がRewriteRuleと一致するかどうかを確認し、RewriteCondの追加条件のみを確認します。



mod_rewriteがディレクティブを実行する順序に言及する価値があります。 RewriteCondは最初に.htaccessに移動し、次にRewriteRuleに移動するため、mod_rewriteは最初にすべての条件をチェックしてから、RewriteRuleの実行に進むようです。



実際、すべては逆に起こります。 最初に、mod_rewriteは、現在の要求値がRewriteRule正規表現と一致するかどうかを確認し、RewriteCondにリストされているすべての条件を確認します。



したがって、RewriteRuleに2ページの正規表現があり、パフォーマンスを考慮して、このルールの実装を追加のRewriteCondに制限することに決めた場合、何も機能しないことがわかります。 この場合、単純なチェックが機能しない場合は、RewriteRule [C]または[S]フラグを使用して、より複雑なルールをスキップすることをお勧めします。



RewriteCondの変数とフラグ、その他のRewriteRuleフラグなど



ドキュメントを読んでください。



RewriteRule、RewriteBase、[L]、[R]、および[QSA]フラグの原理に精通し、mod_rewrite内のリクエスト処理メカニズムも調べました。 影響を受けないものは、他のRewriteRuleフラグ、RewriteCondおよびRewriteMapディレクティブです。



幸いなことに、これらのディレクティブとフラグは謎を隠さず、ほとんどの教科書で説明されているとおりに機能します。 それらを理解するには、公式ドキュメントを読んでください。 まず、RewriteCond-%{QUERY_STING}、%{THE_REQUEST}、%{REMOTE_ADDR}、%{HTTP_HOST}、%{HTTP:header}などで確認できる変数のリストを調べることをお勧めします。



.htaccessのコンテキストとVirtualHostのコンテキストでのmod_rewriteの操作の違い



<VirtualHost>のコンテキストでは、mod_rewriteはまったく逆に機能します。



記事の冒頭で述べたように、上記のすべては.htaccessのコンテキストでのmod_rewriteの使用に適用されます。 mod_rewriteが<VirtualHost>で使用されている場合、動作が異なります。



ヒントと解決策



ここでは、記事の過程で説明できるいくつかのヒントを示しますが、簡潔にするために本文からは除外しました。



正規表現のコンパイル



正規表現を作成して、変更するクエリを正確に定義するようにします。これにより、RewriteRuleルールが別のクエリで誤って機能しないようになります。 例:

# "^" ( )

# "$" ( ):

RewriteRule ^news.php$ index.php

# - :

RewriteRule ^news/(.*)$ index.php



# - .

# - , .

# , .

# "." ().

# http://example.com/news/2009/07/28/b-effect.html

RewriteRule ^news/20[0-9]{2}/[0-9]{2}/[0-9]{2}/[^/]+\.html index.php








ただし、1つの有名なサイトには正規表現に関するセクション全体があります。



外部リダイレクトを変更する



mod_rewriteを使用すると、RewriteRuleを使用して、プロトコルに応じて外部リダイレクトを変更することもできますが、これを行わないことを強くお勧めします。 この記事では、外部リダイレクトを変更する例は、「リンク」や「ファイル」などの概念を取り除き、RewriteRuleがシンプルなラインで機能することをより明確に示すためにのみ使用されます。



mod_rewriteの開発者が誰かがこれを行うとは思わなかったので、あらゆる種類のアーティファクトが可能です。 そうしないでください。



無限ループを止める方法



サイトでのリダイレクトのロジックは、特別なアクションなしではmod_rewriteがリダイレクトの無限ループとして認識する場合があります。 次の例をご覧ください。



サイトには/info.htmlページがありました。 SEOスペシャリストは、/ information.htmlと呼ばれる場合、検索エンジンがこのページのインデックスを作成する方が良いと判断し、info.htmlからinformation.htmlへの外部リダイレクトを要求しました。 ただし、何らかの理由で、サイト開発者は単にinfo.htmlの名前をinformation.htmlに変更してリダイレクトすることはできません。info.htmlファイルから直接データを送信する必要があります。 彼は次のルールを書きます:

#

RewriteRule ^info.html information.html [R,L]

# /information.html info.html

RewriteRule ^information.html info.html








...そして無限のサイクルに直面しています。 各リクエスト/information.htmlは/information.htmlへの外部リダイレクトを再度受け取ります。



この問題を解決するには、少なくとも2つの方法があります。 Habréでは、そのうちの1つがすでに説明されています-環境変数を設定し、その値に基づいてリダイレクトを停止する必要があります。 コードは次のようになります。

RewriteCond %{ENV:REDIRECT_FINISH} !^$

RewriteRule ^ - [L]



RewriteRule ^info.html$ information.html [R,L]

RewriteRule ^information.html$ info.html [E=FINISH:1]








mod_rewriteが変数名に「REDIRECT_」を追加することに注意してください。



2番目の方法は、ユーザーが正確に要求した内容をTHE_REQUESTにチェックインすることです。

# info.html.

# info.html - , .

RewriteCond %{THE_REQUEST} "^(GET|POST|HEAD) /info.html HTTP/[0-9.]+$"

RewriteRule ^info.html$ information.html [R,L]



RewriteRule ^information.html$ info.html










ユーザーの最初のリクエストの分析-Apacheリンクの開示に対する戦い



Apacheは、リクエストを処理するときに、元のリクエストからURLエンコードされた文字を展開します。 場合によっては、これは望ましくない可能性があります。開発者は、最初の変更されていないユーザーリクエストを確認する必要があります。 RewriteCondで%{THE_REQUEST}変数を確認することでこれを行うことができます。

RewriteCond %{THE_REQUEST} ^GET[\ ]+/tag/([^/]+)/[\ ]+HTTP.*$

RewriteRule ^(.*)$ index.php?tag=%1 [L]








ハブでは、 そのようなケースの1つについての議論があり、それから上記の例を取り上げました。



推奨ドキュメント



Apacheの公式ドキュメント 、特に技術的な詳細 。 はい、はい。



ご清聴ありがとうございました!



All Articles