mod_rewrite

つまりざっくり説明するとこんな感じか。
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

Accept-Languageによる言語切り替えをmod_rewriteで実装するには - hrendohの日記

NS

[NS] 一次的なURLリクエストの場合のみ条件を評価(サーバー内部で発せられるサブリクエストの場合は判定をスキップする)

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

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

ApacheでQueryString(URLパラメータ)の値によってBASIC認証をかけたい! - Qiita

RewriteRule .* - [E=admin_access:1]
の方がよいかも?

ハイフン(置換しない) →フラグの操作だけを実行したい場合に使う。
mod_rewriteの考え方。 - こせきの技術日記

#set to 'live' or 'maintenance'
RewriteRule .* - [E=STATUS:maintenance]

http://stackoverflow.com/questions/17852557/use-rewritecond-based-on-environment-variable-in-htaccess

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