MIME types
Content-Type говорит браузеру, что именно он получил: HTML, CSS, JavaScript, JSON, картинку, XML или файл для скачивания.
Если тип неверный, страница может выглядеть сломанной даже при HTTP/2 200.
Проверить Content-Type
curl -kI https://getsrv.app/
curl -kI https://getsrv.app/sitemap-index.xml
Для конкретного asset:
ASSET="$(find /var/www/getsrv.app/assets -maxdepth 1 -type f | head -n 1 | sed 's#^/var/www/getsrv.app##')"
curl -kI "https://getsrv.app$ASSET"
Частые типы
| Файл | Content-Type |
|---|---|
.html | text/html |
.css | text/css |
.js | application/javascript |
.json | application/json |
.xml | text/xml или application/xml |
.svg | image/svg+xml |
.png | image/png |
.jpg, .jpeg | image/jpeg |
.webp | image/webp |
.ico | image/x-icon |
.txt | text/plain |
.pdf | application/pdf |
.zip | application/zip |
.wasm | application/wasm |
.woff2 | font/woff2 |
HTML
Ожидаемо:
curl -kI https://getsrv.app/ | grep -i content-type
content-type: text/html
Если HTML отдаётся как text/plain, браузер может показать исходный текст вместо страницы.
CSS
CSS должен отдаваться как:
content-type: text/css
Если CSS отдаётся как HTML, обычно это означает, что путь к asset сломан, а сервер возвращает fallback HTML или 404-страницу.
JavaScript
JS обычно отдаётся как:
content-type: application/javascript
Если JS отдаётся как text/html, браузер заблокирует выполнение скрипта из-за MIME mismatch.
JSON
Для JSON:
content-type: application/json
Если JSON отдаётся как text/html, клиент может получить HTML-страницу ошибки вместо данных.
SVG
Для SVG:
content-type: image/svg+xml
SVG — активный формат, поэтому для него особенно важны CSP и X-Content-Type-Options: nosniff.
Почему важен nosniff
Заголовок:
X-Content-Type-Options: nosniff
запрещает браузеру “угадывать” тип файла. Это хорошо для безопасности, но требует правильных MIME types.
Если nosniff включён, а JS/CSS отдаются с неправильным Content-Type, браузер может отказаться их применять.
Где MIME types настраиваются в Nginx
Обычно в Nginx подключён файл:
include /etc/nginx/mime.types;
Проверить:
sudo grep -RIn "mime.types\\|default_type" /etc/nginx/nginx.conf /etc/nginx/conf.d /etc/nginx/sites-enabled
Типичный fallback:
default_type application/octet-stream;
Проверка после деплоя
curl -kI https://getsrv.app/ | grep -i content-type
curl -kI https://getsrv.app/sitemap-index.xml | grep -i content-type
ASSET="$(find /var/www/getsrv.app/assets -maxdepth 1 -type f | head -n 1 | sed 's#^/var/www/getsrv.app##')"
curl -kI "https://getsrv.app$ASSET" | grep -i content-type
Типовые проблемы
CSS не применяется
Проверьте:
curl -kI https://getsrv.app/assets/example.css
Если ответ text/html, значит путь ведёт не к CSS.
JS не запускается
Проверьте Content-Type JS-файла и Console в браузере.
Типичный признак:
Refused to execute script because its MIME type is text/html
Sitemap не парсится
Проверьте:
curl -kI https://getsrv.app/sitemap-index.xml
Для sitemap допустимы text/xml или application/xml.
Минимальное правило
Для статического сайта важно не просто получить 200, а проверить пару:
HTTP status + Content-Type
200 text/html для страницы — хорошо.
200 text/html для JS — плохо.
404 text/html для отсутствующей страницы — нормально, если это controlled 404.