読者です 読者をやめる 読者になる 読者になる

maeshimaの日記

メモ書きです

NginxHttpRewriteModuleのドキュメントを読む

NginxHttpRewriteModuleの一部意訳したメモ。自信ないところがわりとあるのでそのへんご了承ください。

if

location の文脈で使うと、思ったように動かなくなったりするようなので基本的には使わない方がいいらしい。locationでもifを使って安全なのは

  • return ...;
  • rewrite ...last;

で使う時だけ。

return

指定したcodeを返す。使えるのは

  • 204
  • 400
  • 402 〜 406
  • 408
  • 410
  • 411
  • 413
  • 416
  • 500〜504

444を指定したときにはヘッダを返さずコネクションを終了させる。

rewrite

基本的には相対パスにマッチする。ホスト名に待ちさせたいとしたら、下記のように if を使う。

if ($host ~* www\.(.*)) {
  set $host_without_www $1;
  rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1 contains '/foo', not 'www.mydomain.com/foo'
}

フラグでrewrite directiveの実行を終了させることが出来る。
もし、置換する文字列がhttp://で始まっていたらクライアントはリダイレクトされ、それ以上の置換は中止される。

フラグ

last
他のURIやlocationの一致を探した後でrewriteを終了する。
break
rewriteを終了する。
redirect
temmporary redirect(302)を返す。http://の代わり。
permanent
parmanent redirect(301)を返す。

その他

  • [0-9]{2}のようにすると数値が二桁という意味
  • 括弧でくくった部分を$1とかで参照できる
  • 10回より多くrewriteすると500エラー。
  • location ディレクティブの中でrewriteが適用されると、適用後にまたlocationディレクティブの内容が適用される→なのでlocation中にrewrite使う場合はbreakフラグを使った方がいい。


基本的にクエリは変換後のURLの末尾に付けられる。末尾に着くのを防ぎたい場合は下記のように変換後のURLの末尾に?を付ける。

rewrite  ^/users/(.*)$  /show?user=$1?  last;