Root cause (NOT a migration defect): MoreThenCms tenant `maljarka`
had `dbo.Sites.SettingsData = NULL` (no `httpSecure` block) -> on a
real HTTPS request SnollaMiddleware throws KeyNotFoundException ->
502. HTTP served 200 fine. DNS/TLS/IIS binding all correct.
Fix applied to shared MSSQL (mssql.kzntsv.site): UPDATE Sites set
SettingsData with httpSecure{enableHttps:true,...} + recycle snolla
pool. Verified 443->200 server-local and external via 80.64.31.36;
kupimknigi untouched. Audit: maljarka was the only NULL-settings
site with a :443 binding (of 25); rimiz degraded for another reason.
- new concept: morethencms-null-settingsdata-https-502
- entities/ruvds-iis-host: maljarka moved from Degraded -> fixed
- index.md + log.md + STATUS.md + NEXT_SESSION.md updated
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
67 lines
5.2 KiB
Markdown
67 lines
5.2 KiB
Markdown
---
|
||
title: MoreThenCms — NULL SettingsData → 502 на HTTPS (per-tenant)
|
||
type: concept
|
||
tags: [morethencms, cms, iis, ruvds, https, 502, mssql, multi-tenant]
|
||
sources: [../sources/iis-migration-to-ruvds-2026-05-23.md]
|
||
updated: 2026-06-08
|
||
---
|
||
|
||
# MoreThenCms — пустой `Sites.SettingsData` ⇒ 502 на HTTPS
|
||
|
||
## Симптом
|
||
|
||
Один тенант catch-all CMS ([[ruvds-iis-host]], движок **MoreThenCms**) недоступен **только по HTTPS**, тогда как остальные живут:
|
||
|
||
| | maljarka | рабочий тенант (kupimknigi) |
|
||
|---|---|---|
|
||
| `:80` (HTTP) | **200** | 200 |
|
||
| `:443` (HTTPS) | **502** Bad Gateway (пустое тело) | 200 |
|
||
|
||
502 приходит с `Server: Microsoft-IIS/10.0`, `X-Powered-By: ASP.NET`, `Content-Length: 0`. В IIS-логе (`W3SVC1`) — `sc-status=502 sc-substatus=0 sc-win32-status=0` (managed-код, **не** HTTP.sys/ARR; ARR на хосте не установлен).
|
||
|
||
## Root cause
|
||
|
||
У сайта в БД `MoreThenCms` (`mssql.kzntsv.site,1433` → `dbo.Sites`) поле **`SettingsData` = NULL**. У рабочих сайтов там JSON с блоком:
|
||
|
||
```json
|
||
"httpSecure": { "enableHttps": true, "httpsOnly": false, "forceHttpsRedirect": false, "forceHttpsApi": false, "forceHttpsAdministration": false }
|
||
```
|
||
|
||
На **HTTPS**-запросе `SnollaMiddleware` читает ключ `httpSecure`/`enableHttps` из настроек сайта. При NULL-настройках ключа нет → `KeyNotFoundException: The given key was not present in the dictionary` (`MoreThenCms.Owin.ErrorHandler.cs:line 61`) → middleware отдаёт **502 до** пайплайна (в логе видно `Begin invoke /` → сразу `End invoke /`, без `RedirectionsService`/рендера). По HTTP блок не читается → страница рендерится (200).
|
||
|
||
Не зависит от хоста — данные в общей БД, поэтому симптом был идентичен и на старом home-IIS:8089. **Не дефект миграции.**
|
||
|
||
## Диагностический след (как ловить)
|
||
|
||
- Логи движка: `C:\Logs\MoreThenCms\log.YYYYMMDD.txt` (log4net). 502-запрос = `Begin invoke /` → `End invoke /` без промежуточных шагов; `KeyNotFoundException` в `Owin.ErrorHandler` (async-стек теряет исходный кадр — он не покажет конкретный словарь, не трать время).
|
||
- Воспроизводить **с самого сервера** против `127.0.0.1` (`curl.exe --resolve host:443:127.0.0.1`), чтобы исключить свой сетевой путь (дома трафик может уходить через VPN/прокси — см. [[proxy-debugging-test-the-real-client]]).
|
||
- Подключение к БД: строка `MoreThenCmsEntities` в `C:\sites\snolla\web.config` (EF-обёртка, `provider connection string=...`). `INFORMATION_SCHEMA.COLUMNS` под app-юзером может быть пуст — читать колонки из ридера (`GetName`), не из метаданных.
|
||
|
||
## Fix
|
||
|
||
Заполнить `SettingsData` сайта блоком `httpSecure` (структуру брать с рабочего sibling-сайта):
|
||
|
||
```sql
|
||
UPDATE dbo.Sites
|
||
SET SettingsData = N'{ "httpSecure": { "enableHttps": true, "httpsOnly": false,
|
||
"forceHttpsRedirect": false, "forceHttpsApi": false, "forceHttpsAdministration": false } }'
|
||
WHERE SiteId = '<site-guid>' AND SettingsData IS NULL; -- гард: не затереть существующие настройки
|
||
```
|
||
|
||
Затем `Restart-WebAppPool snolla` (настройки сайта кэшируются в памяти w3wp). App-native альтернатива: в админке MoreThenCms (`/admin`) включить «HTTPS» в настройках сайта — пишет тот же блок.
|
||
|
||
`httpsOnly/forceHttpsRedirect=false` ⇒ поведение HTTP не меняется, риск минимальный; откат = вернуть `SettingsData = NULL`.
|
||
|
||
## Scope (audit 2026-06-08)
|
||
|
||
На [[ruvds-iis-host]] из 25 SNI-биндингов :443 единственным сайтом с NULL-настройками был **maljarka** — пофикшен 2026-06-08. Прочие ~27 NULL-сайтов **не имеют :443-биндинга** (HTTP-only / неактивные домены) → этот баг их не заденет, пока кому-то не повесят HTTPS-биндинг. **Памятка:** при добавлении нового HTTPS-тенанта на этот CMS — проверить, что у его сайта `SettingsData` содержит `httpSecure`.
|
||
|
||
> Не путать: `rimiz.ru`/www/`rimiz.snolla.com` тоже «degraded», но у них `SettingsData` заполнен — их 502/404 имеет **другую** причину (dead-routes контента), не этот баг.
|
||
|
||
## Cross-refs
|
||
|
||
- Хост: [[ruvds-iis-host]]
|
||
- БД-бэкенд: [[vds-kzntsv]] (MSSQL `mssql.kzntsv.site`)
|
||
- Сетевой анти-паттерн при диагностике: [[proxy-debugging-test-the-real-client]]
|
||
- Контекст миграции: [[../sources/iis-migration-to-ruvds-2026-05-23]]
|