Здравствуйте.
Есть веб-приложение на стеке Java + Spring + Thymeleaf, работает на встроенном томкате. При попытке отправить форму с MultipartFile перекидвыает на страницу example.com/@custom c 404-й ошибкой соответственно.
Код формы:
<form action="/user/change-avatar" method="post" enctype="multipart/form-data">
<div class="form-group">
<label for="avatar-field">Сменить аватар</label>
<div class="input-group">
<input name="file" class="form-control" id="avatar-field" accept="image/jpeg" type="file">
<div class="input-group-append">
<button class="btn btn-secondary" type="submit">Загрузить</button>
</div>
</div>
</div>
</form>
Так как на локальной машине всё работает, подозреваю конфигурацию сервера. На сервере стоят apache и nginx. Приложение работает 8900 порту, апач (насколько я понимаю) проксирует 80 порт на 8900. Конфигурация apache для хоста такая:
<VirtualHost 185.22.***.***:8181>
ServerName example.com
ServerAlias www.example.com
ServerAdmin webmaster@example.com
DocumentRoot /home/example.com/public_html
UseCanonicalName Off
ScriptAlias /cgi-bin/ /home/example.com/public_html/cgi-bin/
# Custom settings are loaded below this line (if any exist)
# Include "/usr/local/apache/conf/userdata/example.com/example.com/*.conf
<IfModule mod_userdir.c>
UserDir disabled
UserDir enabled username
</IfModule>
<IfModule mod_suexec.c>
SuexecUserGroup username username
</IfModule>
<IfModule mod_suphp.c>
suPHP_UserGroup username username
suPHP_ConfigPath /home/username
</IfModule>
<Directory "/home/username/public_html">
AllowOverride All
</Directory>
ProxyPreserveHost on
ProxyPass /.well-known !
ProxyPass "/" "http://example.com:8900/" nocanon
ProxyPassReverse "/" "http://example.com:8900"
AllowEncodedSlashes On
RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
</VirtualHost>
Конфигурацию niginx, по совести говоря, не нашел, да и не понимаю, зачем он нужен - очень слаб в этом вопросе. Подскажите, пожалуйста, в какую сторону копать.
UPD: обычные текстовые формы без enctype="multipart/form-data" сабмитятся нормально
UPD 7.07: нашел конфиг nginx, правда вопрос актуальность потерял - перенёс бэк на другой хост без apache|nginx, там чисто томкат работает, ошибка пропала. Но всё равно на будущее было бы интересно
# Virtual host file starts here
server {
listen 185.22.153.66:443;
access_log /var/log/nginx/access.example.com.log;
error_log /var/log/nginx/error.example.com.log;
server_name example.com www.example.com;
root /home/user/public_html;
ssl on;
ssl_certificate /etc/pki/tls/certs/example.com.bundle;
ssl_certificate_key /etc/pki/tls/private/example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 60m;
add_header Strict-Transport-Security "max-age=31536000";
add_header X-Content-Type-Options nosniff;
location / {
location ~.*\.(3gp|gif|jpg|jpeg|png|ico|wmv|avi|asf|asx|mpg|mpeg|mp4|pls|mp3|mid|wav|swf|flv|html|htm|txt|js|css|exe|zip|tar|rar|gz|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso|woff|ttf|svg|eot|sh)\$ {
expires 7d; #Comment this out if you are using the apache backend cache-control/expires headers.
try_files \$uri \@backend;
}
error_page 405 = \@backend;
error_page 500 = \@custom;
add_header X-Cache "HIT from Backend";
proxy_pass http://185.22.***.***:8181;
include proxy.inc;
}
location \@backend {
internal;
proxy_pass http://185.22.***.***:8181;
include proxy.inc;
}
location \@custom {
internal;
proxy_pass http://185.22.***.***:8181;
include proxy.inc;
}
location ~ .*\.(php|jsp|cgi|pl|py)?\$ {
proxy_pass http://185.22.***.***:8181;
include proxy.inc;
}
location ~ /\.ht {
deny all;
}
}
# Virtual host file ends here