読者です 読者をやめる 読者になる 読者になる

mod_rewriteで条件分岐

URLがある条件にマッチした場合にはURLを書き換えたくない場合がある。
そういうときは [S] (Skip) フラグを使用する。
このフラグを使うとURLが条件にマッチした場合にはn行下までの条件をスキップすることができ、擬似的にIF文のような条件分岐を実現できる。このとき、RewriteRuleは以下の様な構文になる。

RewriteRule <condition> - [S=n]
#URLが<condition>にマッチした場合はn行下までの条件をスキップする


Apache公式ドキュメントに書かれていた例が分かりやすかった。

# Does the file exist?
RewriteCond "%{REQUEST_FILENAME}" "!-f"
RewriteCond "%{REQUEST_FILENAME}" "!-d"
# Create an if-then-else construct by skipping 3 lines if we meant to go to the "else" stanza.
RewriteRule ".?" "-" [S=3]

# IF the file exists, then:
    RewriteRule "(.*\.gif)" "images.php?$1"
    RewriteRule "(.*\.html)" "docs.php?$1"
    # Skip past the "else" stanza.
    RewriteRule ".?" "-" [S=1]
# ELSE...
    RewriteRule "(.*)" "404.php?file=$1"
# END
https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_s