Apache/mod_rewrite

Apache/mod_rewrite

何をしてくれるか?

各機能

mod_rewriteを有効にする

RewriteEngine On

条件を指定する

RewriteCondは条件の番兵のように働く。ズラズラ単に並べて書いていくとRuleに対するAnd条件で結合されていく

URLを書き換える

URLは外部的なアクセスされたそのものと、内部で使っているものがある。 RewriteRuleはそこの間に挟まって操作する。

起点となるURLを指定する

この設定を記述する .htaccesshttp://example.com/hogehoge 階層に設置されていた場合

RewriteBase /hogehoge

とすることで、この階層を起点に後のルールを記述できる

サンプル

ファイル名を指定してリダイレクトする

aaa.html というファイル名が含まれている URL が来たら bbb.html へリダイレクトさせる

RewriteRule aaa.html  bbb.html [R,L]

このコードは RewriteRule の挙動を説明する例で実用上特に意味は無い。

これは階層関係なく aaa.html という名前であればなんでも bbb.html に移動してしまい、 この bbb.html も階層考慮無く RewriteBase を起点にしたものに書き換えるからだ。

ケツの R はリダイレクト L は処理終了を意味している

特定のURLを特定のURLへリダイレクトする

つまり↑の厳密バージョン

RewriteRule ^hoge/aaa\.html  piyo/bbb.html [R,L]

正規表現で先頭指定することで階層を厳密に判定するようにした

先頭にスラッシュをつけると、RewriteBase を無視してドメインのルートからと判定される。

不要なURLを切り詰める

RewriteRule     ^/hoge/(.*)  /$1 [L]

この場合だと不要なhogeというURLを切り詰める

後ろの[L]の表記はマッチしたらここでおしまいということだ

任意のURLを1階層切り詰めるには

RewriteRule     ^/[^/]*/(.*) /$1 [L]

のようにしてスラッシュまでを切り詰める

デバイス判定

トラブル

htaccess 等を変更したのに反映されない

Google Chrome 等であるようだが、リダイレクト等の挙動をキャシュしてしまうことがあるそうだ

Firefox のシークレットモードとかで確認してみるとよい

Query String(クエリストリング)付URLが RewriteRule で変換できない

mod_rewrite の RewriteRule では

http://hogehogehoge.com/index.php?aaa=bbb&ccc=ddd

みたいな、パラメータがくっついた URL を変換することができない。

何故かと言うと、mod_rewrite では、この Query String(?以降の部分) と URL 部分(index.php の部分) は別扱いになるからである。

なのでパラメータ部分も含めた合致条件で変換する場合 RewriteRule ではなく RewriteCond のほうで条件指定してやる必要がある

Tag

apache/mod_rewrite.txt · 最終更新: 2016-12-27 18:42 by ore