mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-10-30 01:34:59 +03:00
1d85ef138e
* 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
109 lines
8.4 KiB
Plaintext
109 lines
8.4 KiB
Plaintext
---
|
||
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>
|