揮発性のメモ2

知識をメモ書きしておく

Apacheで、リライト機能を使う

/etc/httpd/conf.d/unko.conf

# http://192.168.0.2/unko/photo/hogehoge.jpg
# を、Apacheのrewrite機能により 次のように変換する
#    /unko/photo/hogehoge.jpg
# ⇒ /unko/getphoto.php?filename=hogehoge.jpg


Alias "/unko" "/opt/unko/www"
<Directory "/opt/unko/www">
    AllowOverride all
    Require all granted

    RewriteEngine On
    RewriteRule ^(.*)/photo/(.*\.jpg)$ $1/getphoto.php?filename=$2 [L,QSA]
    # rewriteのログを見たいとき用
    # LogLevel alert rewrite:trace6
</Directory>

フラグ

[L,QSA] の L は、条件にマッチしたらそこで処理を終える Lastフラグ
具体的には次のような条件のとき、ABCDEF も ABC も両方とも FINALになる

    RewriteRule ^(.*)/ABCDEF/(.*)$ $1/ABC/$2
    RewriteRule ^(.*)/ABC/(.*)$ $1/FINAL/$2

[L]が付いてると、ABCDEF は ABC になり、FINALにはならない。 ABCはちゃんと FINAL になる

    RewriteRule ^(.*)/ABCDEF/(.*)$ $1/ABC/$2 [L]
    RewriteRule ^(.*)/ABC/(.*)$ $1/FINAL/$2 [L]

ルールが1行しかないときはどうでもいいけど、とりあえず付けておく癖を付けておいた方がいい


[L,QSA] の QSA は、クエリにある変数を取っとく Query String Appendフラグ
具体的には次のような条件のとき、
ABC/hoge.jpg?piyo=fuga は get.php?file=hoge.jpg になって piyo=fugaは無くなっちゃうが
EDF/hoge.jpg?piyo=fuga は get.php?file=hoge.jpg&piyo=fuga となり、変数が&までついてちゃんと残る。

    RewriteRule ^(.*)/ABC/(.*)$ $1/get.php?file=$2
    RewriteRule ^(.*)/EDF/(.*)$ $1/get.php?file=$2 [QSA]

変数がないときはどうでもいいけど、とりあえず付けておく癖を付けておいた方がいい


参考:
mod_rewriteのQSAフラグの存在をよく忘れる件 - でじくる。
mod_rewrite - Apache HTTP Server Version 2.4
.htaccess に RewriteRule 書くときは、[L]フラグをつけてもそこで終了しないかもよ?って話。 #Apache - Qiita