RewriteEngineについて

Rewriteの話

DrupalのRewriteエンジンは下記のよう記述されている。

  RewriteRule ^ - [E=protossl]
  RewriteCond %{HTTPS} on
  RewriteRule ^ - [E=protossl:s]

行頭からなんでも、リダイレクトしない(-の意味がわからないので、多分そうじゃないかという推測) が [E]は環境変数らしいから、環境変数protosslを値なしで設定する。んで、次の行で、httpsがオンだった時は、環境変数protossl=sを設定するという意味だと思う。ここは調べてもよくわからなかった。

 RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

これも、おんなじで環境変数HTTP_AUTHORIZATIONにサーバ変数から取得したHTTP:Authorizationを設定するという意味と思う。%{ }はサーバ変数の取得らしい。

RewriteRule "(^|/)\." - [F]

行頭、または/に続く .  がある場合は、アクセス禁止(Forbidden)

  RewriteBase /

ベースが/で設定されるので、ここから、ほんとのRewrite設定かな?

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^ index.php [L]

Rewriteの条件は、REQUEST_FILENAMEがファイルでなく、ディレクトリでもない時を意味しているようだ。!は否定なので、!-fはファイル以外、!-dはディレクトリ以外で、次の=の意味がわからないんだけど、/favicon.icoでもない場合に、全部index.phpにリダイレクトして [L]で終了だよと、意味かしら。

なので、本来の目的、httpをhttpsにリダイレクトしたいなら、上記4行の上に下記を書けばいいように思えてきた。R=301は永続的なリダイレクトでページの評価を引き継ぐことができるようです。デフォルトは302で一時的なリダイレクト、となるようです。

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://cycle.eek.jp/$1 [R=301,L]

どないやろか。。httpsでなかったら、httpsでリダイレクトする。

とりあえず、うまく行っているようだ。。このままにしておこう。

なんかぜんぶをきちんと書いたるページがない、だから調べまくって記載することになる。ある程度わかっている人が必要な情報だけを書くからそうなっているんだと思う。これは、ソフトの書き方とかを調べるときにも行き当たる問題で、情報はたくさんあるのに本当に知りたいことが少ないという。。。でも、些細なことまで書いてたらしんどいよね、実際、ボランティアだしね。

正規表現の一覧

RewriteCondでは条件に一致するパターンをPerl互換の正規表現で指定するらしい。この正規表現がいやらしい、というかいつも謎。phpの表現でも必ずでてくる。マスタしなければいけないと思いつつ、いつも真似して書いてそのままだから身につかない。

パターン 意味
. 任意の1文字。
[ ] 括弧内のいずれかの文字。
[^ ] 括弧内のいずれかの文字以外。
| または。
? 直前の文字の0回または1回の繰り返し
* 直前の文字の0回以上の繰り返し。
+ 直前の文字の1回以上の繰り返し。
( ) 選択範囲の境界を明示する、もしくは後方参照を作成する。
^ 行頭。
$ 行末。
$n (0 <= n <= 9) 後方参照。 n番目の( )内の値が入ります。
%{ } サーバ変数の取得。
\ (日本語環境では円マーク)正規表現の特殊文字をエスケープする。

条件パターンの一覧

正規表現とともに、条件も記載されているのでさらにわかりにくい。

パターン 意味
! 否定
< テスト文字列より上の場合true
> テスト文字列より下の場合true
= テスト文字列と等しい場合true
<= テスト文字列以上の場合true
>= テスト文字列以下の場合true
-d (is directory)ディレクトリが存在すればtrue
-f (is regular file)ファイルが存在すればtrue
-eq (is numerically equal to)いわゆる「=」
-ge (is numerically greater than or equal to)いわゆる「<=」
-gt (is numerically greater than)いわゆる「<」
-le (is numerically less than or equal to)いわゆる「>=」
-lt (is numerically less than)いわゆる「>」
-F (is existing file, via subrequest)アクセス可能な有効なパスを指している場合にtrue (内部サブリクエストを用いてcheckされる)
-l (is symbolic link)シンボルリンク(-H、-Lも同じ意味。ちなみに小文字エルです)
-s (is regular file, with size)ファイルが存在し、サイズが0でなければtrue
-U (is existing URL, via subrequest)アクセス可能な有効なURLとなっている場合にtrue
-x (has executable permissions)実行権限がある場合にtru

RewriteRuleのフラグ

フラグ 意味
B 英数字のエスケープ。不明
C チェーン。次の処理を連続して行う場合に指定する。
CO=NAME:VAL Cookieをセットすることができる。書式:CO=NAME:VAL:domain[:lifetime[:path[:secure[:httponly]]]]
DPI PATH_INFOの削除。PATH_INFOとは実際のスクリプトファイル名とクエリ文字列の間にある、クライアントが提供するパス名情報。
END リライト処理を停止する。Lはルールセットだけだが、ENDの場合は.htaccess単位で終了するので後のリライトは無効になる。v2.2では使えなくなったようです。
E=[!]VAR[:VAL] 環境変数をセットできます。セットするときは[E=VAR:VAL]、削除するときは[E=!VAR]とする。例)hogeという閑居言う変数にhugaを入れる。[E=hoge:huga]
F クライアントに403 Forbiddenステータスコードを返す。
G クライアントに410 Goneステータスコードを返す。
H=Content-handler 実行するアプリケーションを指定するハンドラを強制的に付ける。application/x-httpd-phpなど。設定ファイルでAddType application/x-httpd-php .phpとしておけば同じハンドラの場合はPHPプログラムとして実行されてる。
L Lフラグが付くとそこでルールセットが停止する。直後に続くルールを実行しない。
N 書き換えを行ったら、ルールセットの最初からやり直す。
NC no case。大文字小文字を区別しない。
NE noescape。エスケープをしなくなる。通常は&や%はURLエスケープされるが、このフラグを使うとエスケープせずにそのままの文字になる。
NS 現在のリクエストがサブリクエストの場合はルールをスキップ。
P ルールに一致したリクエストをプロキシを介して処理する。以降の処理はプロキシに渡るのでLフラグと同じようにルールの進行は停止する。
PT uri フィールドに filename フィールドの値をセットする。直後にmod_aliasでディレクトリ構造の書き換えを行う際などに利用する。
QSA クエリ文字列部分に書き換えではなく、文字を追加したい場合に指定する。通常「?」後のクエリ文字列は削除されるため利用する。
QSD クエリ文字列がある場合削除される。これはデフォルトの動作。
R[=code] クライアントに外部へのリダイレクトとレスポンスコードを返す。何も指定しないと302で返す。[R=301]等とすればレスポンスコードを変更できる。
S=num 指定した数のルールをスキップする。[s=2]とすれば、一致した場合、以降のルールを2つ飛ばす。if-then-elseを実現できる。
T=MIME-type 一致した項目にMIME-typeを付加する。AddTypeと同じ挙動。