LoginSignup
2

posted at

.htaccessのRewriteRule,RewriteCondで理解に苦しんだ事のメモ

転送設定でおなじみのRewriteRuleとRewriteCond。
何回やっても翌月にはわからなくなるので意味不明ハマりポイントだけメモ。

RewriteCondの「-f」はオプションではない。

RewriteCondの書き方でググるとこういう説明が出てくる。

RewriteCond %変数名(テスト文字列) 条件パターン(正規表現) [フラグ]

出典: https://weblabo.oscasierra.net/apache-rewritecond-base/

これでパッと分かることは、
・RewriteCondがif文で引数の1つ目と二つ目を比較する。
・1つ目の引数がターゲットになるURLのパターンで組み込み変数でホストやドキュメントルートが使える。
・2つ目の引数に条件になる正規表現を書く。

で、今回ハマった実例がこれ。

RewriteCond %{DOCUMENT_ROOT}/$1.webp -f

jpegの画像をwebpに変えるタスクでググっていたら出てきたものです。

え、どういう意味?ってなりました。

まあたぶん、$1.webp までが引数の1つ目になるターゲットURLですね。
で、それに-fオプションがついている?

・・とLinuxコマンドのように読んでしまいましたが、全然違いました。
「-f」は.htaccess独自の正規表現の代わりになる関数的なものらしい。

-d ディレクトリが存在する場合は true
-f ファイルが存在する場合は true
! 否定

出典:https://www.webdesignleaves.com/pr/html/htaccess.html

他にも色々あったけど、こういう感じで正規表現の代わりに使える。
だから上の例だと

%{DOCUMENT_ROOT}/$1.webp 

に該当するパスにファイルが存在していたらif条件がtrueになって、次に現れるRewriteRuleが実行されるという意味になる。

RewriteCondに$1があるのに対応するカッコがない。

さっきの例でターゲットのURLに$1って書いてあるけどこれは何が代入されるのでしょうか?
この$1は正規表現で検索条件の一部をカッコ()でくくって、その中身を置換結果にもってくる(キャプチャ)ための$1です。

が、この行に()はありません。
じゃあ$1には何が入るの?%{DOCUMENT_ROOT}に関係する何か?

全然違いました。

なんとこの後の行で出てくるRewriteRuleにあるカッコから巻き上げてキャプチャしてきます。

RewriteRule (.*)\.(jpe?g|png)$ $1.webp [T=image/webp,E=accept:1]

はい、ここで1つ目の引数のURLを2つめの引数のURLに置換しています。
で、この1つ目の(.*)の部分が上の行のRewriteCondに代入されるんですね。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2