WordPressでちょっと長めのテーブルや長めの文章を投稿しようとしたときに
Request Entity Too Large
The requested resource /wp/wp-admin/post.php does not allow request data with POST requests, or the amount of data provided in the request exceeds the capacity limit.
というメッセージが表示されてエラーになってしまいました。
"capacity limit"とあるので、POSTデータが大きくてphp.iniのpost_max_sizeやupload_max_filesizeに引っかかってしまったのかと思いphpinfo()で確認してみたのですが
256MBもあるやん!
256MBもあって"capacity limit"になるってどんなデータをPOSTしとるやねんッ!
むしろそんな大容量のデータをアップするなら分割アップロードする形のプログラムの処理にせんかいッ!
どないやねん、どないやねん、どないやねん。
こういうときはサーバのエラーログをみることが鉄則。
仮想サイトごとにログが保存されている「logs」ディレクトリの「error_log」をみてみると
[client XXX.XXX.XXX.XXX] ModSecurity: Request body no files data length is larger than the configured limit (131072).. Deny with code (413) [hostname "www.----.--"] [uri "/wp/wp-admin/post.php"] [unique_id "-------------------------"], referer: http://www.----.--/wp/wp-admin/post.php?post=16&action=edit
ModSecurity? 131072?
131072というと128KB。128KBで制限がかかってる。
しかも理由が「Request body no files data length」ということで添付ファイルがないPOSTデータが128KB以上なのでブロックしましたとさ。
しかもModSecutiryだなんて……たしかにPlesk初期構築時にModSecurityはインストールはしたけども影響を心配して管理画面からオフにしているはずなのに……
うん、確かにオフになっている。
オフになっていたらModSecurityは機能しないんじゃないの?
/etc/httpd/conf.dディレクトリをみてみると
ちゃっかり、mod_security.confファイルがIncludeされてる……
しかも「SecRuleEngine On」「SecRequestBodyAccess On」と書かれていて無効化している形跡がない……
<IfModule mod_security2.c> # ModSecurity Core Rules Set configuration IncludeOptional modsecurity.d/*.conf IncludeOptional modsecurity.d/activated_rules/*.conf # Default recommended configuration SecRuleEngine On SecRequestBodyAccess On SecRule REQUEST_HEADERS:Content-Type "text/xml" \ "id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML" SecRequestBodyLimit 13107200 SecRequestBodyNoFilesLimit 131072 SecRequestBodyInMemoryLimit 131072 SecRequestBodyLimitAction Reject SecRule REQBODY_ERROR "!@eq 0" \ "id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_erro r_msg}',severity:2" SecRule MULTIPART_STRICT_ERROR "!@eq 0" \ "id:'200002',phase:2,t:none,log,deny,status:44,msg:'Multipart request body \ failed strict validation: \ PE %{REQBODY_PROCESSOR_ERROR}, \ BQ %{MULTIPART_BOUNDARY_QUOTED}, \ BW %{MULTIPART_BOUNDARY_WHITESPACE}, \ DB %{MULTIPART_DATA_BEFORE}, \ DA %{MULTIPART_DATA_AFTER}, \ HF %{MULTIPART_HEADER_FOLDING}, \ LF %{MULTIPART_LF_LINE}, \ SM %{MULTIPART_MISSING_SEMICOLON}, \ IQ %{MULTIPART_INVALID_QUOTING}, \ IP %{MULTIPART_INVALID_PART}, \ IH %{MULTIPART_INVALID_HEADER_FOLDING}, \ FL %{MULTIPART_FILE_LIMIT_EXCEEDED}'" SecRule MULTIPART_UNMATCHED_BOUNDARY "!@eq 0" \ "id:'200003',phase:2,t:none,log,deny,status:44,msg:'Multipart parser detected a possible unmatched boundary. '" SecPcreMatchLimit 1000 SecPcreMatchLimitRecursion 1000 SecRule TX:/^MSC_/ "!@streq 0" \ "id:'200004',phase:2,t:none,deny,msg:'ModSecurity internal error flagged: %{MATCHED_VAR_NAME}'" SecResponseBodyAccess Off SecDebugLog /var/log/httpd/modsec_debug.log SecDebugLogLevel 0 SecAuditEngine RelevantOnly SecAuditLogRelevantStatus "^(?:5|4(?!04))" SecAuditLogParts ABIJDEFHZ SecAuditLogType Serial SecAuditLog /var/log/httpd/modsec_audit.log SecArgumentSeparator & SecCookieFormat 0 SecTmpDir /var/lib/mod_security SecDataDir /var/lib/mod_security </IfModule>
SecRequestBodyNoFilesLimitで定義されている値が原因でエラーが表示されてしまった様です。
この数値を大きくして問題は解消しました。
しかし、「オフ」と書かれていればModSecurity自体が無効になると思いますよね。Pleskでは結構こういうことが起こるので気をつけなければ。