マニュアル: mod_rewrite

投稿日: 更新日:

注意点

RewriteCondを複数のRewriteRuleに適用できない

以下のように書いても、2番目のRewriteRuleにはRewriteCondが適用されない。

RewriteCond ...
RewrireRule ...
RewriteRule ...

RewriteCond解釈の前に、RewriteRuleが解釈される

Apache mod_rewrite Introductionの Regex Back-Reference Availabilityのところに記載されていますが、上から順番ではなく、 RewriteRuleを先に解釈します。 RewriteCondに$1とか書けるようにするためのようです。

Let's Encryptをリライト対象から除外

以下のように書きます。

RewriteCond %{REQUEST_URI} !^/\.well\-known/acme-challenge/

.well-knownRFC 5785で定義されているので .well-knownだけ除外すればいいかと思ったんですが、 そもそもLet's Encrypt以外HTTPでアクセスする必要性がないため、除外する理由がないですね。。。

SSLでも同じ設定を使いたい場合

以下のようにしてください。

<VirtualHost _default_:443>
RewriteEngine On
RewriteOptions Inherit

クエリパラメータがないときだけ追加

RewriteCond %{QUERY_STRING} !param=
RewriteRule "^/path$" "/path?param=value" [L]

ログ出力

Apache 2.4

以下のように設定してください。error_logにログが出力されます。 ただし、ログが急激に増えるため、デバッグ時のみ使用してください。

LogLevel info rewrite:trace8

Apache 2.2

RewriteLogで設定します。

RewriteLog /var/log/httpd/rewrite.log
RewriteLogLevel 8

フラグ

RewriteRule Flags - Apache HTTP Server Version 2.4

RewriteRule pattern target [Flag1,Flag2,Flag3]のように記載する。

  • L(last): ルールセットの処理をここで打ち切る。
  • P(proxy): mod_proxyを使って処理を行う。
  • QSA(qsappend): クエリ文字列を追加する。
  • R(redirect): リダイレクトする。デフォルトは302
    • [R=305]とすると、HTTPステータスコード305でリダイレクトする。
    • 3xxのステータスコードはRFC 7231 6.4参照。

正規表現

Regular Expressions参照。

ディレクトリトラバーサルは気にしなくてよい(はず)

HTTP 1.0/1.1で、パスに..を含む場合、404 Bad Requestになる (どこで規定されているかは未調査)のため、 ディレクトリトラバーサルは気にしなくてよいです。

公式サイト