Nginxで静的ページにPostすると405で取得できない場合の対処
やりたいこと
Nginxでメンテナンスモードで503を返すようにしたかった。Getリクエストであれば、503を返すことができるが、静的ページにPostリクエストすると405になってしまった(´; ω ;`)。これはNginxの仕様らしい...
実施方法
recursive_error_pages on
- nginxドキュメント
- error_pageを使用して複数回リダイレクトさせることを有効とする
- 503の処理の中で405を静的ページに指定して静的ファイルにリダイレクトさせる
recursive_error_pages on; location @maintenance { if (-f $request_filename) { break; } error_page 405 = /maintenance.html; rewrite ^(.*)$ /maintenance.html break; }
- 検証で設定したconfファイルの全体
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name localhost; error_page 503 @maintenance; recursive_error_pages on; if (-e /var/www/html/maintenance.html) { set $maintenance true; } if ($maintenance = true) { return 503; } location / { try_files $uri $uri/ =404; } location @maintenance { if (-f $request_filename) { break; } error_page 405 = /maintenance.html; rewrite ^(.*)$ /maintenance.html break; } }
実行結果 ( 対策前 )
$ curl -X POST localhost -d id=hoge
<html> <head><title>405 Not Allowed</title></head> <body bgcolor="white"> <center><h1>405 Not Allowed</h1></center> <hr><center>nginx/1.14.0</center> </body> </html>
実行結果 ( 対策後 )
$ curl -X POST localhost -d id=hoge
<html> <p> This is Maintenance Page </p> </html>
関連
- Nginxでメンテナンスページの設定をする