--- name: modsec SecRequestBodyNoFilesLimit causa 413 description: Apache+mod_security devolve 413 em POSTs grandes nao-multipart por default 1MB - fix em modsec2.user.conf type: feedback originSessionId: 4fcacab0-14f5-48d4-9ca9-322e9af89c9f aliases: - mod_security 413 - SecRequestBodyNoFilesLimit - 413 Apache base64 tags: - claude-memory/feedback - apache - mod_security - infra created: 2026-05-04 --- # 413 do Apache em POST com body grande no-file > [!warning] Sintoma confuso > Endpoint do CI4 recebe POST `application/x-www-form-urlencoded` (form com **imagens base64 inline em campo de texto**, ex: corpo de email no Quill/TinyMCE) e o Apache responde **HTTP 413 Request Entity Too Large** com a página HTML padrão do Apache — **mesmo se nginx, php-fpm e `.user.ini` estiverem com limites altos**. ## Causa raiz mod_security default: | Diretiva | Default | Aplica a | |---|---|---| | `SecRequestBodyLimit` | 128 MB | multipart **com** files | | `SecRequestBodyNoFilesLimit` | **1 MB** | form-urlencoded ou multipart **sem** file | `SecRequestBodyLimitAction ProcessPartial` só vale para `SecRequestBodyLimit`. Para `NoFilesLimit` o default é **REJECT** → gera 413. ## Why Imagem colada num editor rico (Quill/TinyMCE) vai como texto base64 dentro do campo `corpo_html`. **NÃO** conta como upload de arquivo. Estoura o 1MB silenciosamente. A pilha externa (nginx → Apache → PHP) aceita, mas modsec corta antes de chegar ao PHP. ## How to apply Quando ver 413 do Apache (template HTML padrão "Request Entity Too Large") em endpoint que recebe HTML rico/imagens base64: 1. Conferir `nginx -T | grep client_max_body_size` (deve ser ≥ tamanho esperado). 2. Conferir `.user.ini` `post_max_size`/`upload_max_filesize`. 3. **Conferir mod_security**: - Teste local com `curl -F "campo=@arquivo"` (file = passa pelo `SecRequestBodyLimit`, geralmente OK). - Teste local com `curl --data-urlencode "campo=..."` (no-file = pega `NoFilesLimit`). Se o teste com `-F` passa mas `--data-urlencode` falha → **é mod_security**. ## Fix Edite `/etc/apache2/conf.d/modsec/modsec2.user.conf`: ```apache SecRequestBodyLimit 536870912 SecRequestBodyNoFilesLimit 536870912 SecRequestBodyInMemoryLimit 134217728 ``` Reload: ```bash /scripts/restartsrv_httpd # cPanel # ou apachectl graceful ``` ## Diagnóstico definitivo `/usr/local/apache/logs/modsec_audit.log` — requests com 413 do user externo aparecem lá. Requests locais via `--resolve` com upload `-F` **passam** (caem em `Limit`, não `NoFilesLimit`) → **teste local engana**. ## Histórico Aplicado pela primeira vez em **2026-05-04** no servidor `sistema.gotechbr.com.br` para destravar agendamento de e-mail com imagem inline no Quill — após horas debugando nginx/PHP achando que era ali. ## Links - [[acessos_servidores|Acessos servidores]] - [[deploy_procedimento|Procedimento de deploy]]