Обновлено:

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
.htmltext/html
.csstext/css
.jsapplication/javascript
.jsonapplication/json
.xmltext/xml или application/xml
.svgimage/svg+xml
.pngimage/png
.jpg, .jpegimage/jpeg
.webpimage/webp
.icoimage/x-icon
.txttext/plain
.pdfapplication/pdf
.zipapplication/zip
.wasmapplication/wasm
.woff2font/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.