注意点
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-known
はRFC 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参照。
正規表現
ディレクトリトラバーサルは気にしなくてよい(はず)
HTTP 1.0/1.1で、パスに..
を含む場合、404 Bad Requestになる
(どこで規定されているかは未調査)のため、
ディレクトリトラバーサルは気にしなくてよいです。