サポートログ

Request Entity Too Largeで投稿できない

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では結構こういうことが起こるので気をつけなければ。

-サポートログ
-, ,