Apacheでのリダイレクト、URLの変更、HTTPからHTTPSへのリダイレクト-Mod_Rewriteルールについて知りたいと思っていたが、尋ねるのが怖かったすべて


264

これは、Apacheのmod_rewriteに関する標準的な質問です。

リクエストURLを変更するか、最初にリクエストしたURLとは異なるURLにユーザーをリダイレクトするには、mod_rewriteを使用します。これには次のようなものが含まれます。

  • HTTPからHTTPSへの変更(またはその逆)
  • 存在しないページへのリクエストを新しい置換に変更する。
  • URL形式の変更(?id = 3433から/ id / 3433など)
  • 月と太陽の下で可能なものに基づいて、ブラウザ、リファラーに基づいて異なるページを表示します。
  • URLをいじりたいもの

Mod_Rewriteルールについて知りたいと思っていたものの、尋ねるのが怖かったものすべて!

mod_rewriteルールの作成のエキスパートになるにはどうすればよいですか?

  • mod_rewriteルールの基本的な形式と構造は何ですか?
  • どの形式/フレーバーの正規表現をしっかりと把握する必要がありますか?
  • 書き換えルールを記述する際の最も一般的な間違い/落とし穴は何ですか?
  • mod_rewriteルールをテストおよび検証するための良い方法は何ですか?
  • mod_rewriteルールのSEOまたはパフォーマンスへの影響はありますか?
  • mod_rewriteがジョブに適したツールのように見えるかもしれませんが、そうではない一般的な状況はありますか?
  • 一般的な例は何ですか?

ルールをテストする場所

htaccessのテスターのウェブサイトは、あなたのルールで遊んで、それらをテストするには絶好の場所です。デバッグ出力も表示されるため、一致したものと一致しなかったものを確認できます。


9
この質問の背後にある考え方は、より一般的なユーザーを夢中にさせるmod_rewriteの無限の質問すべてに近い道を提供することです。これは、serverfault.com/questions/49765/how -does-subnetting- workでサブネット化を行った場合と非常に似ています。
カイルブラント

1
また、私はこの質問にあまり多くの賛成票を送りたくないので、答えに行くべきです。すべてのmod_rewriteの質問を終わらせるためにmod_rewriteの回答を望んでいることをポスターが完全に認められるようにするため、これをCWにしたくありません。
カイルブラント

4
申し訳ありませんが、私は質問を支持しました。;-) mod-rewriteタグ検索/フィルタの上部(またはその近く)に表示する必要があると本当に思います。
スティーブン

Else(tm)の誰かが一般的なユースケースを処理する必要があります。私はそれを正義にするのに十分なほどよく知りません。
sysadmin1138

おそらく、この質問をmod-rewriteタグwikiにリンクして、パスをさらに短くする必要があります。
beldaz

回答:


224

mod_rewrite構文の順序

mod_rewriteには、処理に影響する特定の順序規則があります。何かを行う前RewriteEngine Onに、mod_rewrite処理をオンにするため、ディレクティブを指定する必要があります。これは、他の書き換えディレクティブの前にある必要があります。

RewriteCond上記RewriteRuleは、1つのルールを条件の対象にします。次のRewriteRulesは、あたかも条件の対象ではないかのように処理されます。

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html

この単純なケースでは、HTTPリファラーがserverfault.comからのものである場合、ブログリクエストを特別なserverfaultページにリダイレクトします(私たちはまさにその特別な存在です)。ただし、上記のブロックに追加のRewriteRule行がある場合:

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html
RewriteRule $/blog/(.*)\.jpg         $/blog/$1.sf.jpg

ここから来たことを示すリファラーを持つページだけでなく、すべての.jpgファイルは特別なサーバー障害ページに移動します。これは明らかに、これらのルールの記述方法の意図ではありません。複数のRewriteCondルールを使用して実行できます。

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

しかし、おそらくいくつかのトリッキーな置換構文で行う必要があります。

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

より複雑なRewriteRuleには、処理の条件が含まれています。最後の括弧は、(html|jpg)RewriteRuleにhtmlまたはのいずれかjpgに一致し、一致した文字列を書き換えられた文字列で$ 2として表すように指示します。これは、2つのRewriteCond / RewriteRuleのペアを使用して、前のブロックと論理的に同一であり、4行ではなく2行で実行します。

複数のRewriteCond行は暗黙的にAND結合され、明示的にOR結合できます。ServerFaultとスーパーユーザーの両方からのリファラーを処理するには(明示的OR):

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)    [OR]
RewriteCond %{HTTP_REFERER}                ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

ServerFault参照ページをChromeブラウザーで提供するには(暗黙的AND):

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteCond %{HTTP_USER_AGENT}             ^Mozilla.*Chrome.*$
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

RewriteBaseまた、次のRewriteRuleディレクティブが処理を処理する方法を指定するため、順序固有です。.htaccessファイルで非常に便利です。使用する場合、.htaccessファイルの「RewriteEngine on」の下の最初のディレクティブである必要があります。次の例をご覧ください。

RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

これは、現在処理しているこの特定のURL が物理ディレクトリパス(/ home / $ Username / public_html / blog)ではなくhttp://example.com/blog/を経由して到着したことをmod_rewriteに伝え、それに応じて処理します。このため、RewriteRule文字列の開始はURLの「/ blog」の後にあると見なされます。これは、2つの異なる方法で書かれた同じものです。1つはRewriteBaseを使用し、もう1つは使用しない:

RewriteEngine On

##Example 1: No RewriteBase##
RewriteCond %{HTTP_REFERER}                                   ^https?://serverfault\.com(/|$)
RewriteRule /home/assdr/public_html/blog/(.*)\.(html|jpg)     $1.sf.$2

##Example 2: With RewriteBase##
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

ご覧のとおり、RewriteBase書き換えルールにより、Web サーバーではなくコンテンツへのWeb サイトのパスを活用できます。これにより、このようなファイルを編集するユーザーにとってわかりやすくなります。また、ディレクティブを短くすることができ、審美的な魅力があります。


RewriteRuleの一致構文

RewriteRule自体には、文字列を照合するための複雑な構文があります。別のセクションでフラグ([PT]など)について説明します。システム管理者はマンページを読むよりも例で学ぶことが多いので、例を挙げて、彼らが何をするのかを説明します。

RewriteRule ^/blog/(.*)$    /newblog/$1

.*構築物は任意の1文字に一致し(.)、0回以上(*)。括弧で囲むと、$ 1変数として一致した文字列を提供するように指示されます。

RewriteRule ^/blog/.*/(.*)$  /newblog/$1

この場合、最初の。*は括弧で囲まれていないため、書き換えられた文字列には提供されません。このルールは、新しいブログサイトのディレクトリレベルを削除します。(/blog/2009/sample.htmlは/newblog/sample.htmlになります)。

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$2

この場合、最初の括弧式は一致するグループを設定します。これは$ 1になり、不要であるため、書き換えられた文字列では使用されません。

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$1/$2

この場合、書き換えられた文字列で$ 1を使用します。

RewriteRule ^/blog/(20[0-9][0-9])/(.*)$   /newblog/$1/$2

このルールは、文字範囲を指定する特別なブラケット構文を使用します。[0-9]は、0〜9の数字に一致します。この特定のルールは、2000〜2099年を処理します。

RewriteRule ^/blog/(20[0-9]{2})/(.*)$  /newblog/$1/$2

これは前のルールと同じことを行いますが、{2}部分は前の文字(この場合はブラケット式)に2回一致するように指示します。

RewriteRule ^/blog/([0-9]{4})/([a-z]*)\.html   /newblog/$1/$2.shtml

このケースは、2番目に一致する式の小文字と一致し、できるだけ多くの文字に対して一致します。\.コンストラクトは、実際の期間ではなく、それは前の例である特殊文字としてピリオドを処理するためにそれを伝えます。ただし、ファイル名にダッシュが含まれている場合は破損します。

RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html  /newblog/$1/$2.shtml

これは、ダッシュを含むファイル名をトラップします。ただし、-ブラケット式の特殊文字と同様に、式の最初の文字である必要があります。

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

このバージョンでは、ファイル名に含まれる文字、数字、または文字でファイル名をトラップします-。これは、ブラケット式で複数の文字セットを指定する方法です。


RewriteRuleフラグ

書き換えルールのフラグには、多くの特別な意味とユースケースがあります。

RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html  /newblog/$1/$2.shtml  [L]

フラグは、[L]上記の式の最後にあります。複数のフラグをコンマで区切って使用できます。リンクされたドキュメントではそれぞれについて説明していますが、とにかくここにあります:

L =最後。これが一致したら、RewriteRulesの処理を停止します。注文数!
C =チェーン。次のRewriteRuleの処理を続行します。このルールが一致しない場合、次のルールは実行されません。これについては後で詳しく説明します。
E =環境変数を設定します。Apacheには、Webサーバーの動作に影響するさまざまな環境変数があります。
F =禁止。このルールが一致する場合、403-Forbiddenエラーを返します。
G =消えました。このルールが一致する場合、410-Goneエラーを返します。
H =ハンドラー。要求が指定されたMIMEタイプであるかのように処理されます。
N =次へ。ルールを再び最初からやり直して、再一致させます。注意してください!ループが発生する可能性があります。
NC =ケースなし。許可するjpgjpgとJPGの両方に一致します。
NE =エスケープなし。特殊文字(。?#&など)が16進コードに相当するものに書き換えられないようにします。
NS =サブリクエストなし。サーバー側インクルードを使用している場合、これにより、インクルードされたファイルとの一致が防止されます。
P =プロキシ。mod_proxyによるルールの処理を強制します。Webサーバーがコンテンツを取得して再提供するため、他のサーバーからコンテンツを透過的に提供します。これは危険なフラグです。不完全に書かれたものはあなたのウェブサーバーをオープンプロキシに変えてしまい、それは悪いです。
PT =パス​​スルー。RewriteRuleマッチングのエイリアスステートメントを考慮してください。
QSA = QSAppend。元の文字列にクエリが含まれている場合(http://example.com/thing?asp=foo)書き換えられた文字列に元のクエリ文字列を追加します。通常は破棄されます。動的コンテンツにとって重要です。
R =リダイレクト。指定されたURLへのHTTPリダイレクトを提供します。正確なリダイレクトコード[R = 303]も提供できます。に非常に似てRedirectMatchおり、高速で、可能な場合に使用する必要があります。
S =スキップ。このルールをスキップします。
T =タイプ。返されるコンテンツのMIMEタイプを指定します。AddTypeディレクティブに非常に似ています。

RewriteCondルールが1つだけに適用されると言ったことがわかりますか?まあ、チェーンでそれを回避できます。

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html     [C]
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

最初のRewriteRuleにはChainフラグがあるため、2番目のrewrite-ruleは最初のRewriteCondルールが一致したときに実行されます。Apacheの正規表現が脳を傷つける場合に便利です。ただし、最初のセクションでポイントするオールインワンライン方式は、最適化の観点からは高速です。

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

これはフラグを使用して簡単にできます。

RewriteRule ^/blog/([0-9]{4})/([-0-9a-z]*)\.html   /newblog/$1/$2.shtml   [NC]

また、一部のフラグはRewriteCondにも適用されます。特に、NoCase。

RewriteCond %{HTTP_REFERER}        ^https?://serverfault\.com(/|$)     [NC]

「ServerFault.com」に一致します


9
よくやった。[充填剤]
EEAA

3
とても素敵mod_rewriteで正規表現の入門書。+1。
スティーブン

3
それはことを知っていると便利な場合がありますRewriteCond実際に処理された後にRewriteRule一致しています。「RewriteRuleに先行するRewriteCondは、その1つのルールを条件の対象にします」と言う上部の近くに「後でもっと」と言いたいかもしれません。正規表現はPerl互換の正規表現であることに言及してください。また、「... RewriteRuleは文字列の開始と見なします...」に無関係なアポストロフィがあります。
Dennis Williamson

2
RewriteRule ^/blog/.*/(.*)$ /newblog/$1最初のディレクトリコンポーネントと一致しません-リライタはデフォルトで貪欲です。/.*/(.*)は/ 1 /(2)/と/ 1/2/3/4/5 /(6)/の両方に一致するため、/ [^ /] * /は最初のパスのみに一致する必要があります成分。
アダプター

1
@ sysadmin1138、私はこの答えは良いのですが、それらのフラグは、彼らがどのように動作するか明らかにされていませんので、あなたが例とフラグE、N、NS、P、PT、およびSに、より精巧な場合、それは良いことができると思うなど
Pacerier

39

mod_rewriteルールの基本的な形式と構造は何ですか?

これらの点については、sysadmin1138の優れた回答に従うことにします。

どの形式/フレーバーの正規表現をしっかりと把握する必要がありますか?

sysadmin1138で説明されている構文順序、構文一致/正規表現、およびRewriteRuleフラグに加えて、mod_rewriteがHTTPリクエストヘッダーとApacheの構成に基づいてApache環境変数を公開していることに言及していると思います。

mod_rewriteで使用できる変数の包括的なリストについては、AskApacheのmod_rewriteデバッグチュートリアルをお勧めします。

書き換えルールを記述する際の最も一般的な間違い/落とし穴は何ですか?

RewriteRuleのほとんどの問題は、PCRE構文の誤解や、特殊文字を適切にエスケープできないこと、または照合に使用される変数の内容に対する洞察の欠如に起因します。

典型的な問題と推奨されるトラブルシューティング:

  • 500-内部サーバーエラー - 構成ファイル内のWindowsキャリッジコントロールが存在する場合は削除し、mod_rewriteが有効になっていることを確認し(IfModuleこのシナリオを回避するために条件でディレクティブをラップ)、ディレクティブ構文をチェックし、問題が特定されるまでディレクティブをコメントアウトします
  • リダイレクトループ -RewriteLogおよびRewriteLogLevelを使用し、問題が特定されるまでディレクティブをコメント化します

mod_rewriteルールをテストおよび検証するための良い方法は何ですか?

まず、照合する予定の環境変数の内容を確認します。PHPがインストールされている場合、これはアプリケーションに次のブロックを追加するのと同じくらい簡単です。

<?php
  var_dump($_SERVER);
?>

...次に、ルールを(できれば開発サーバーでのテスト用に)記述し、Apache ErrorLogファイルの一致しない一致またはアクティビティを記録します。

より複雑なルールについては、mod_rewriteのRewriteLogディレクティブを使用してアクティビティをファイルに記録し、設定しますRewriteLogLevel 3

mod_rewriteルールのSEOまたはパフォーマンスへの影響はありますか?

AllowOverride allApacheは.htaccessファイルをチェックし、リクエストごとにディレクティブを解析する必要があるため、サーバーのパフォーマンスに影響します。可能な場合は、サイトのVirtualHost構成にすべてのディレクティブを保持するか、.htaccess必要なディレクトリに対してのみオーバーライドを有効にします。

Googleのウェブマスター向けガイドラインには、「ユーザーを欺いたり、ユーザーに表示する以外のコンテンツを検索エンジンに提示したりしないでください。これは一般に「クローキング」と呼ばれます。」-検索エンジンロボットをフィルターするmod_rewriteディレクティブの作成は避けてください。

検索エンジンロボットは1:1のcontent:URIマッピングを好みます(これはコンテンツへのリンクをランク付けするための基礎です)-mod_rewriteを使用して一時的なリダイレクトを作成する場合、または複数のURIで同じコンテンツを提供する場合は、正規のURIを指定することを検討してくださいHTMLドキュメント。

mod_rewriteがジョブに適したツールのように見えるかもしれませんが、そうではない一般的な状況はありますか?

これはそれ自体が巨大な(そして潜在的に論争の的になる)トピックです-ケースバイケースで使用に対処し、提案された解決策が彼らのニーズに適切かどうかを質問者に判断させるより良い(IMHO)。

一般的な例は何ですか?

AskApacheのmod_rewriteのトリックとヒントは、定期的に表示されるほぼすべての一般的なユースケースをカバーしていますが、特定のユーザーの「正しい」ソリューションは、ユーザーの設定と既存のディレクティブの洗練度に依存する場合があります(これが一般的にmod_rewriteの質問が発生するたびに、ユーザーが他のディレクティブを設定していることを確認することをお勧めします。


AskApacheリンクをありがとう。それは私が探していたものです!
sica07

AskApacheピエロは、ASFによって公式にサポートされていません。彼が言っていることの多くは、議論の余地があるか、明らかに間違っています。
アダプター

@adaptr明らかに知っている優れたリソースを共有してください。
danlefree

「mod_rewriteがジョブに適したツールのように見えるかもしれませんが、そうではない一般的な状況ですか?」- シンプルでmod_rewriteが既に使用されていないリダイレクト、。mod_aliasを使用するRedirectか、RedirectMatch代わりに。また、Apacheのドキュメントを参照してください:mod_rewriteを使用しない場合は
MrWhite

21

多くの管理者/開発者のように、私は長年にわたって複雑な書き換えルールと戦い、既存のApacheドキュメントに不満を抱いているのでmod_rewrite、Apacheの他の部分と実際にどのように動作し相互作用するかを知るための個人的なプロジェクトとして決めましたコアなので、ここ数か月にわたってstrace、ソースコードを掘り下げてテストケースをインストルメント化して、これらすべてを処理しています。

書き換えルールの開発者が考慮する必要がある重要なコメントを次に示します。

  • 書き換えのいくつかの側面は、サーバ設定ファイル、バーチャルホスト、ディレクトリ、.htaccess処理に共通している
  • 一部の処理は、PerDir(.htaccess)処理とは対照的に、ルート構成(サーバー構成、仮想ホスト、およびディレクトリ)で大きく異なります。
  • さらに悪いことに、PerDir処理はほぼ無差別に内部リダイレクトサイクリングをトリガーできるため、ルート構成要素は、そのようなPerDir処理がこれをトリガーできることを認識して記述する必要があります。

このため、書き換えユーザーコミュニティを2つのカテゴリに分割し、それらを完全に分離したものとして扱う必要がほとんどあると言ってしまうでしょう。

  • Apache configへのルートアクセス権を持つユーザー。これらは通常、アプリケーション専用サーバー/ VMを使用した管理者/開発者であり、ここでのメッセージは非常に単純.htaccessです。可能な限りファイルを使用しないでください。サーバーまたは仮想ホストの設定ですべてを行います。開発者はデバッグを設定でき、rewrite.logファイルにアクセスできるため、デバッグは合理的に簡単です。

  • 共有ホストサービス(SHS)のユーザー

    • そのようなユーザー、使用.htaccess可能な代替手段がないため、/ Perdir処理を使用する必要あります。
    • さらに悪いことに、そのようなユーザーのスキルレベル(mod_rewriteの正規表現駆動のラダーロジックを使用する場合)は、通常、経験豊富な管理者よりも大幅に低くなります。
    • Apacheとホスティングプロバイダーは、デバッグ/診断サポートを提供しません。唯一の診断情報は、リダイレクトの成功、間違ったURIへのリダイレクトです。または404/500ステータスコード。これにより、彼らは混乱し、無力になります。
    • Apacheは、このユースケースで書き換えがどのように機能するかを説明するのは非常に弱いです。たとえば、PerDir .htaccessファイルが選択されている理由とその理由についての明確な説明を提供していません。PerDirサイクリングの複雑さとこれを回避する方法については説明しません。

3番目のコミュニティが存在する可能性があります。SHSプロバイダーの管理およびサポートスタッフは、両方のキャンプに足を踏み入れ、上記の結果に苦しむ必要があります。

私はこの記事を短くするためにここでは繰り返さない多くの詳細なポイントをカバーする記事スタイルのブログ投稿をいくつか書きました(例えば.htaccessファイルでの書き換えルールの使用に関する詳細)。私は自分の共有サービスを持っているだけでなく、いくつかの専用およびVM FLOSSプロジェクトをサポートしています。SHSアカウントのテスト手段として標準のLAMP VMを使用し始めましたが、最終的には適切なミラーVM(ここで説明)を実行する方が良いことがわかりました。

ただし、管理者コミュニティが.htaccessユーザーをどのようにサポートするかという点では、次の項目を開発して提供する必要があると感じています。

  • 書き換えシステムがPerDir処理で実際に機能する方法の一貫した説明
  • .htaccess書き換えルールの作成方法に関する一連のガイドライン/ベストプラクティス
  • W3C htmlパーサーに似た単純なWebベースの書き換えスクリプトパーサーですが、ユーザーはテストURIまたは同じテストベクトルを入力して、書き換えロジックのフローの即時ログを取得できます/
  • ルールから組み込み診断を取得する方法に関するヒント(例:

    • 後方参照($ Nまたは%N)を展開[E=VAR:EXPR]するという事実を利用して、EXPRそれらをターゲットスクリプトの診断として使用できるようにします。
    • [OR]、[C]、[SKIP]、および[L]フラグを使用して書き換えルールを局所的に順序付けて、内部リダイレクトを悪用することなく書き換えスキーム全体が機能する場合、以下をルール1として追加して回避できますすべてのループの面倒:

      RewriteCond %{ENV:REDIRECT_STATUS} !=""
      RewriteRule .  -  [L]
      

これはよく文書化されています。ドキュメンテーションにこれが説明されていないのはなぜですか?
アダプター

2
あなたがしなければならないのは、.htaccessトピックにサブスクライブすることです。ほとんどの初心者は絶望的に混乱します-これらのほとんどは、LAMPサービスと共有サービスでのmod_rewriteの最初の経験があるため、system / vhost構成へのルートアクセス権がないため、.htaccessファイルごとのディレクトリごとの処理を使用する必要があります。初心者が「出血」しなければならない重要な違いがあります。私は自分をパワーユーザーと見なし、まだ微妙な点を発見しています。私が言ったように、私はいくつかの側面を解決するためにstraceとソースコードスキャンを使用しなければなりませんでした。:-(
TerryE

全くもって同じ意見です。「書き換えユーザーコミュニティを2つのカテゴリに分割し、それらを完全に分離したものとして扱う必要があります。」一部のユーザーは共有ホスティングを使用しており、エキスパートにさえ非常に壊れやすく、複雑で、混乱しやすいに依存する必要があり.htaccessます。まだ問題があります。
ライアン

15

rewritemapを使用する

rewritemapsでできることはたくさんあります。RewritemapsはRewritemapディレクティブを使用して宣言され、RewritCond評価とRewriteRule Subsitutionsの両方で使用できます。

RewriteMapの一般的な構文は次のとおりです。

RewriteMap MapName MapType:MapSource

例えば:

RewriteMap examplemap txt:/path/to/file/map.txt

その後、次のような構成体にマップ名を使用できます。

${examplemap:key}

マップにはキー/値のペアが含まれています。キーが見つかった場合、値は置換されます。単純なマップは単なるテキストファイルですが、ハッシュマップ、さらにはSQLクエリを使用することもできます。詳細はドキュメントにあります:

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap

エスケープ解除文字列。

いくつかの操作を行うために使用できる4つの内部マップがあります。特に、エスケープされない文字列は便利です。

例:クエリ文字列の文字列「cafe」をテストしたい。ただし、ブラウザはサーバーに送信する前にこれをエスケープするため、一致するすべての文字列に対してURLエスケープバージョンが何であるかを把握するか、単にエスケープ解除する必要があります...

RewriteMap unescape int:unescape

RewriteCond %{QUERY_STRING}  (location|place)=(.*)
RewriteCond ${unescape:%2}   café
RewriteRule ^/find/$         /find/1234? [L,R]

1つのRewriteCondを使用して、クエリ文字列パラメーターの引数をキャプチャし、2番目のrewriteCondのマップを使用してエスケープ解除する方法に注意してください。次に、これが比較されます。また、%1には "location"または "place"が含まれるため、rewritemapのキーとして%2を使用する必要があることに注意してください。括弧を使用してパターンをグループ化すると、それらもキャプチャされます。キャプチャの結果を使用するかどうかは...


最後の文はまったく真実ではありません。mod_rewrite正規表現エンジンは、次のような非キャプチャグループをサポート(?:location|place)し、これは一例では1つのキャプチャを持っています。
TerryE

12

書き換えルールを記述する際の最も一般的な間違い/落とし穴は何ですか?

あなたの中から、たとえば見かけのパス、変更URLを書き換えるときは本当に簡単落とし穴がある /base/1234/index.htmlのを/base/script.php?id=1234。スクリプトの場所への相対パスを持つ画像またはCSSは、クライアントによって検出されません。これを解決するための多くのオプションがこのfaqにあります


1
リンクをありがとう。特に、書き換えに慣れていない他のチームメンバーと作業する場合、<base>タグを追加するのが最も簡単で、相対パスを有効にすることができます。
kontur
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.