Nginx の rewrite(リダイレクト) をデバッグする
Nginx の rewrite ディレクティブを使用することで簡単にリダイレクトすることができます。
この rewrite ディレクティブは正規表現が使えて、非常に便利な反面、正しく動作(リダイレクト)しない場合のデバッグが非常に難しいときがあります。
そんなとき、Nginxでは、エラーログに rewrite ディレクティブの動作をロギングしてくれる機能があります。
そこで、今回は、Nginx の rewrite(リダイレクト) をデバッグするためのログ採取と簡単な見方を解説してみます。
Nginx の rewrite(リダイレクト) をデバッグする
rewrite(リダイレクト) ディレクティブの動作をロギングする
Nginx で rewrite(リダイレクト) ディレクティブの動作をロギングするには、以下のようにやれば簡単にエラーログファイルにロギングすることができます。
/etc/nginx/nginx.confの設定例
...
server {
server_name www.example.com;
...
error_log /var/log/nginx/example-error.log notice;
rewrite_log on;
...
}
...
|
error_log /var/log/nginx/example-error.log notice;
エラーログの保存先を設定します。
ここでは、/var/log/nginx/example-error.log へ保存します。
第2パラメータは、以下の値を設定することができます。デフォルトは、
error となります。
- debug
- info
- notice
- warn
- error
- crit
- alert
- emerg
上に行くほど情報量は多くなります。
rewrite(リダイレクト) ディレクティブの動作をロギングする場合は、
notice以上である必要があります。
rewrite_log on;
rewrite(リダイレクト) ディレクティブの動作をロギングするか否かを設定します。
ここでは、on : ロギングする を設定しています。
デフォルトは、off : ロギングしない となります。
rewrite(リダイレクト) ディレクティブのロギングを確認してみる
先に設定したロギング情報から、rewrite(リダイレクト) ディレクティブが正しく動作しているか確認してみます。
ここでは、Nginx で Feedly のリンクアドレスにくっついてくる utm_source=feedly を消してリダイレクトしてみる で使用したrewrite の設定を確認してみます。
/etc/nginx/nginx.confの設定例
...
server {
server_name www.example.com;
...
error_log /var/log/nginx/example-error.log notice;
rewrite_log on;
...
if ( $args ~ "(.*)&?utm_source=feedly&?(.*)" ) {
set $args $1$2;
rewrite ^ $scheme://$host$uri permanent;
}
...
}
...
|
この設定では、URIに utm_source=feedly
が含まれていたら、それを削除してリダイレクトします。
例えば、
http://www.example.com/test.html?utm_source=feedly
へアクセスしたら、
http://www.example.com/test.html
へリダイレクトすればOKとなります。
実際にアクセスしてロギング(/var/log/nginx/example-error.log)を確認してみましょう。
...
2013/04/25 17:25:04 [notice] 10173#0: *6 "(.*)&?utm_source=feedly&?(.*)" matches "utm_source=feedly", client: 192.168.1.100, server: www.example.com, request: "GET /test.html?utm_source=feedly HTTP/1.1", host: "www.example.com"
2013/04/25 17:25:04 [notice] 10173#0: *6 "^" matches "/test.html", client: 192.168.1.100, server: www.example.com, request: "GET /test.html?utm_source=feedly HTTP/1.1", host: "www.example.com"
2013/04/25 17:25:04 [notice] 10173#0: *6 rewritten redirect: "http://www.example.com/test.html", client: 192.168.1.100, server: www.example.com, request: "GET /test.html?utm_source=feedly HTTP/1.1", host: "www.example.com"
2013/04/25 17:25:04 [notice] 10173#0: *6 "(.*)&?utm_source=feedly&?(.*)" does not match "", client: 192.168.1.100, server: www.example.com, request: "GET /test.html HTTP/1.1", host: "www.example.com"
...
|
"(.*)&?utm_source=feedly&?(.*)" matches ...
で、先に設定した if文 の 正規表現に一致(matches) したことがわかります。
"^" matches ...
で、先に設定した rewrite ディレクティブ の 正規表現に一致(matches) したことがわかります。
rewritten redirect: "http://www.example.com/test.html" ...
で、先に設定した rewrite ディレクティブ の リダイレクトが実行されたことがわかります。
"(.*)&?utm_source=feedly&?(.*)" does not match ...
で、リダイレクト後は、if文 の 正規表現に一致しない(does not matches) ことがわかります。
さらに、
http://www.example.com/test.html?ccc=dddd&utm_source=feedly&aaaa=bbb
へアクセスしてみます。
...
2013/04/25 17:35:33 [notice] 10173#0: *7 "(.*)&?utm_source=feedly&?(.*)" matches "ccc=dddd&utm_source=feedly&aaaa=bbb", client: 192.168.1.100, server: www.example.com, request: "GET /test.html?ccc=dddd&utm_source=feedly&aaaa=bbb HTTP/1.1", host: "www.example.com"
2013/04/25 17:35:33 [notice] 10173#0: *7 "^" matches "/test.html", client: 192.168.1.100, server: www.example.com, request: "GET /test.html?ccc=dddd&utm_source=feedly&aaaa=bbb HTTP/1.1", host: "www.example.com"
2013/04/25 17:35:33 [notice] 10173#0: *7 rewritten redirect: "http://www.example.com/test.html?ccc=dddd&aaaa=bbb", client: 192.168.1.100, server: www.example.com, request: "GET /test.html?ccc=dddd&utm_source=feedly&aaaa=bbb HTTP/1.1", host: "www.example.com"
2013/04/25 17:35:33 [notice] 10173#0: *7 "(.*)&?utm_source=feedly&?(.*)" does not match "ccc=dddd&aaaa=bbb", client: 192.168.1.100, server: www.example.com, request: "GET /test.html?ccc=dddd&aaaa=bbb HTTP/1.1", host: "www.example.com"
...
|
rewritten redirect: "http://www.example.com/test.html?ccc=dddd&aaaa=bbb" ...
で、先に設定した rewrite ディレクティブ の リダイレクトが思ったとおりutm_source=feedly
を削除して実行されたことがわかります。
rewrite (リダイレクト) は、簡単な設定であれば、ログ情報での確認まで必要ないかもしれません。
if文、正規表現などを駆使して、難しい設定をした場合などは、このログ情報でどこまで一致したか確認できて、デバッグ作業がはかどることがよくあります。
困ったときに、このログの採取方法を思い出すと、きっと幸せになれる?と思います。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
関連記事 :
コメントを投稿 :