# Ordinis Integrator Guide — nginx serving static HTML на /docs/. # Diplodoc генерирует relative links — alias корректно работает без rewrite. server { listen 8080 default_server; listen [::]:8080 default_server; server_name _; access_log /dev/stdout; error_log /dev/stderr; # K8s probe. location = /healthz { access_log off; return 200 "ok\n"; add_header Content-Type text/plain; } # Source maps: Diplodoc CLI 4.60 не генерит .map файлы, но оставляет # `//# sourceMappingURL=` комментарии в JS/CSS. DevTools пытается тянуть. # 204 No Content триггерит "Unexpected EOF" — DevTools пытается распарсить # пустое body как JSON sourcemap. Отдаём минимально валидный empty sourcemap. location ~* "^/docs/.*\.map$" { access_log off; log_not_found off; default_type application/json; return 200 '{"version":3,"sources":[],"names":[],"mappings":"","file":""}'; } # Static assets (Diplodoc CLI 4.60 bug: HTML refs hashed names типа # `_bundle/app-34c68624e23be7ce.css`, но actual файл — `app.css` (без # hash). Strip hash в nginx через rewrite: `name-.ext` → `name.ext`. location ~* "^/docs/(_bundle|_assets)/(.+?)-[a-f0-9]{8,}(\.[a-z0-9]+)$" { alias /usr/share/nginx/html/$1/$2$3; expires 1y; add_header Cache-Control "public, immutable"; } # Non-hashed assets (fallback). НЕ добавлять `try_files $uri =404` — # nginx bug: с `alias` $uri резолвится по document root, а не по alias path, # → ложные 404 на легитимные файлы (tabs-extension.js падает в эту дыру). # Если файла нет — alias сам отдаст 404 от open() failure. location ~* ^/docs/((_bundle|_assets)/.*\.(css|js|woff2?|ttf|eot|svg|png|jpg|jpeg|ico|map|json))$ { alias /usr/share/nginx/html/$1; expires 1y; add_header Cache-Control "public, immutable"; } # Documentation pages (HTML). location /docs/ { alias /usr/share/nginx/html/; index index.html; try_files $uri $uri/ $uri.html =404; expires 5m; add_header Cache-Control "public, must-revalidate"; } # Redirect /docs (без trailing slash) → /docs/. location = /docs { return 301 /docs/; } # Security headers. add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; }