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 =ケースなし。許可するjpg
jpgと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」に一致します