Files
3x-ui/docs/content/docs/ru/config/subscription.mdx
T
NgaiYeanCoi 1d85ef138e fix(sub): prevent default profile page URL disclosure (#6538)
* fix(sub): prevent default profile page URL disclosure

Add explicit none, builtin, and custom profile page modes.
Preserve existing custom URLs and warn before exposing the built-in page.
Cover mode selection, legacy settings, and subscription response headers.

* fix(subscription): add profile page link options and upgrade notes
2026-09-15 21:13:29 +02:00

109 lines
8.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Подписка
description: Запуск сервера подписок 3x-ui — форматы base64/JSON/Clash, порты и пути, TLS, заголовки ответа и пользовательские шаблоны.
icon: Rss
---
**Подписка** — это единый URL, который возвращает все конфигурации клиента.
Клиентские приложения периодически обновляют его, поэтому при изменении
входящего соединения клиенты подхватывают изменения автоматически. Сервер
подписок работает как **отдельный** сервер от панели.
## Включение и настройка
Сервер подписок **включён по умолчанию** (`subEnable`). Настройте его в
параметрах подписки панели:
| Параметр | По умолчанию | Назначение |
| ------------- | ------- | --------------------------------------------------------------- |
| `subPort` | `2096` | Порт прослушивания (отдельный от панели). |
| `subListen` | _(все)_ | Адрес привязки. |
| `subPath` | _(случайный для каждой панели)_ | Базовый путь для необработанных URL подписок. |
| `subDomain` | _(нет)_ | Публичный хост; если задан, сервер отвечает только для этого Host. |
| `subCertFile` / `subKeyFile` | _(нет)_ | Сертификат + ключ TLS — когда заданы, сервер работает по **HTTPS**. |
| `subEncrypt` | `true` | Кодировать тело необработанной подписки в base64. |
| `subUpdates` | `12` | Рекомендуемый интервал обновления (часы), отправляемый клиентам. |
URL подписки выглядит так:
```text
https://<sub-host>:<sub-port>/<sub-path>/<sub-id>
```
где `<sub-id>` — это **Sub ID** клиента.
Один и тот же Sub ID отдаётся в нескольких форматах по разным путям — список
**Base64** по `subPath` и конфигурация **JSON** (Xray-json) по пути JSON.
Соберите URL и предпросмотрите оба тела здесь:
<SubscriptionBuilder />
## Форматы вывода
**Формат выбирается по пути**, у каждого свой переключатель включения:
| Формат | Путь | Включается | Вывод |
| --------------------- | --------- | ---------------- | --------------------------------------------------- |
| **Необработанные ссылки** | `subPath` | всегда (если включён) | Список ссылок `vless://`, `vmess://`, … (закодированных в base64, когда включён `subEncrypt`). |
| **JSON** | `subJsonPath` | `subJsonEnable` | Полные клиентские конфигурации Xray. |
| **Clash / Mihomo** | `subClashPath` | `subClashEnable` | YAML-профиль. |
В подписке появляются только включённые входящие соединения, использующие
**VLESS, VMess, Trojan, Shadowsocks, WireGuard, AmneziaWG, MTProto, TUIC или Hysteria2**, упорядоченные по их индексу
сортировки подписки (TUIC и AmneziaWG включаются в raw-ссылки и профили Clash/Mihomo, но исключаются из JSON-конфигов; MTProto включается в raw-ссылки). Запрос `subPath` с заголовком `Accept: text/html` (или
`?html=1`) возвращает удобочитаемую информационную страницу вместо
необработанного тела.
### Base64 vs JSON
Тело **Base64** — это просто ссылки для обмена, объединённые через перевод
строки и закодированные в стандартный base64 (переключается через `subEncrypt`).
Тело **JSON** оборачивает каждого клиента в полную клиентскую конфигурацию
Xray — фиксированный каркас (локальные входящие SOCKS/HTTP на 127.0.0.1, DNS, маршрутизация,
policy) плюс исходящее соединение `proxy`, указывающее на входящее. 3x-ui
выдаёт **единый объект конфигурации для одного клиента и массив для
нескольких**, использует плоскую форму `settings` исходящего соединения
(`address`/`port`/`id`, `level: 8`) и удаляет `sockopt` из `streamSettings`.
## Заголовки ответа
Подписки возвращают стандартные заголовки, которые читают совместимые
приложения:
- **`Subscription-Userinfo`** — `upload`, `download`, `total` (байты; `total=0`
означает без ограничений) и `expire` (Unix-секунды).
- **`Profile-Update-Interval`** — интервал обновления в часах (`subUpdates`).
- **`Profile-Title`**, **`Support-Url`**, **`Profile-Web-Page-Url`**,
**`Announce`** — необязательный брендинг, отображаемый некоторыми клиентами.
### Ссылка на страницу профиля
В настройках **Подписка → Профиль** поле **Страница профиля** (`subProfileMode`)
управляет ссылкой для всех клиентов подписки:
- **Без ссылки** (`none`, по умолчанию) — заголовок `Profile-Web-Page-Url` не отправляется.
- **Встроенная страница подписки** (`builtin`) — ссылка на встроенную страницу подписки.
- **Свой сайт** (`custom`) — адрес из `subProfileUrl`; если он пуст, заголовок не отправляется.
**После обновления:** если `subProfileMode` ещё не задан, а прежний `subProfileUrl`
пуст или содержит только пробелы, вместо автоматической ссылки на встроенную
страницу теперь используется **Без ссылки**. Существующий непустой пользовательский
адрес сохраняется в режиме **Свой сайт**.
Чтобы вернуть прежнюю ссылку, выберите **Встроенная страница подписки** в этом поле
и сохраните настройки. Эта страница раскрывает URL-адреса подписок и конфигурации
узлов, в том числе для зашифрованных подписок Happ.
## Пользовательские шаблоны страниц
Укажите в `subThemeDir` папку с пользовательским шаблоном информационной
страницы, чтобы оформить HTML-страницу подписки в фирменном стиле. Примечание
для каждого клиента на каждой ссылке полностью шаблонизируется — см.
[Ссылки для обмена → переменные примечаний](/docs/config/share-links#remark-template-variables).
<Callout type="info">
Разместите сервер подписок за TLS (задайте `subCertFile`/`subKeyFile` или
[обратный прокси](/docs/operations/reverse-proxy)), чтобы содержимое подписки
не передавалось в открытом виде.
</Callout>