つまりざっくり説明するとこんな感じか。
VirtualHostディレクティブの場合はURLのパスが対象となり先頭に/がつく
Directoryディレクティブや.htaccessの場合はそのディレクトリからの相対ファイルパスが対象になり先頭に/がつかないApacheのRewriteRuleで検索条件に^/がマッチしない場合がある理由 - このブログはURLが変更になりました
リダイレクト
RewriteRule Flags - Apache HTTP Server Version 2.2
R のデフォルトは 302
- 301 Moved Permanently
- 302 Moved Temporarily
301 Moved Permanently にする場合は明示的に [R=301] と書く
クエリストリング(パラメーター)を消す
●クエリーを消す
逆に、クエリーを消すにはリダイレクト先に ? だけつけておく。
RewriteRule ^/cgi-bin/.* /?
http://www.example.com/cgi-bin/hoge.cgi?q=foo
は
http://www.example.com/
となり、q=foo は削除される。http://tech.bayashi.jp/archives/entry/techweb/2007/001995.html
ブラウザの言語設定で振り分け
RewriteEngine on
RewriteCond %{HTTP:Accept-Language} ^ja [NC]
RewriteRule ^/index.html$ /index.ja.html
RewriteRule
Patternにマッチするものは VirtualHost context と Directory (htaccess) contextで異なる
What is matched?
In VirtualHost context, The Pattern will initially be matched against the part of the URL after the hostname and port, and before the query string (e.g. "/app1/index.html").
In Directory and htaccess context, the Pattern will initially be matched against the filesystem path, after removing the prefix that led the server to the current RewriteRule (e.g. "app1/index.html" or "index.html" depending on where the directives are defined).
If you wish to match against the hostname, port, or query string, use a RewriteCond with the %{HTTP_HOST}, %{SERVER_PORT}, or %{QUERY_STRING} variables respectively.
http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewriterule
VirtualDocumentRoot と Rewrite
Mod_Rewrite Forums • View topic - Use a RewriteCond in virtual host using VirtualDocumentRoot
server-info (server-status) はRewriteしない
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/server-(info|status)$
RewriteRule ^ - [L]
...
クエリストリング(パラメーター)の値でベーシック認証
Rewriteを使う。
ApacheでURLのクエリ文字列によりアクセス制限 | Livingdeadの日記 | スラド
RewriteEngine On RewriteCond %{QUERY_STRING} area=admin RewriteRule (.*) $1 [E=admin_access:1]Order allow,deny Allow from All Deny from env=admin_access AuthUserFile /etc/httpd/conf/.htpasswd AuthGroupFile /dev/null AuthName "Administorator's Area" AuthType Basic require valid-user Satisfy Any
RewriteRule .* - [E=admin_access:1]
の方がよいかも?
ハイフン(置換しない) →フラグの操作だけを実行したい場合に使う。
mod_rewriteの考え方。 - こせきの技術日記
#set to 'live' or 'maintenance' RewriteRule .* - [E=STATUS:maintenance]
L
mod_rewriteは上から順番に処理が実行される
RewriteRuleのフラグに[R]や[L]が付与された場合、条件にマッチした時点で書き換え処理を停止し、それ以降の書き換えは行わない。(以降のルールセットは評価されない)
よって、指定する順番が挙動に影響します。
mod_rewriteは指定順が大事。WordPressなどのルーティング設定に注意 | 株式会社グランフェアズ
The simplified form of this is that once the rules have been processed, the rewritten request is handed back to the URL parsing engine to do what it may with it.
RewriteRule Flags - Apache HTTP Server Version 2.4
「この処理は一度書き換えを行った後、そのアクセスを行えるかどうかを判別する為にURLパースエンジンに書き換えたものを戻すよ」
と書かれています。
.htaccess に RewriteRule 書くときは、[L]フラグをつけてもそこで終了しないかもよ?って話。 - Qiita 2016
END