Как скрыть Rest API маршрут из списка маршрутов WP JSON?

Ссылка скопирована
1 ответ

Создал маршрут в WordPress через register_rest_route();, хочу скрыть его из общего списка маршрутов /wp-json/
Можно ли как-то его оттуда убрать, не закрывая полностью Rest API для публичного доступа?

Как скрыть Rest API маршрут из списка маршрутов WP JSON?

Дополнительно:

Разве аргумент show_in_index не делает то, что вы просите?
Так же, при помощи permission_callback можно сделать ограничение на использование

  • show_in_index то, что нужно, спасибо!
    /bitrix24/v1/lead скрыл

    Как можно убрать из списка /bitrix24/v1?

  • Илья Петров, по такому же принципу не получается скрыть?
  • Не получилось

    Код:

    add_action('rest_api_init', function(){ 	register_rest_route('bitrix24/v1', '', [ 		'methods'				=> 'GET', 		'callback' 				=> '__return_true', 		'permission_callback'	=> '__return_true', 		'show_in_index'			=> false, 	]); });

    add_action('rest_api_init', function(){ register_rest_route('bitrix24/v1', '', [ 'methods' => 'GET', 'callback' => '__return_true', 'permission_callback' => '__return_true', 'show_in_index' => false, ]); });

    Как скрыть Rest API маршрут из списка маршрутов WP JSON?

  • Илья Петров, можно попробовать удалить его отображение хуком, но на работоспособность не проверял:
    add_filter('rest_index', function ($routes) {     if (isset($routes['bitrix24/v1'])) {         unset($routes['bitrix24/v1']);     }     return $routes; });

    add_filter('rest_index', function ($routes) { if (isset($routes['bitrix24/v1'])) { unset($routes['bitrix24/v1']); } return $routes; });

  • maksam07, выдает критическую ошибку
  • maksam07, поправил чуть-чуть — заработало!
    add_filter('rest_index', function ($routes){ 	if (isset($routes->data['routes']['/lead/v1'])){ 		unset( $routes->data['routes']['/lead/v1'] ); 	}  	return $routes; });

    add_filter('rest_index', function ($routes){ if (isset($routes->data['routes']['/lead/v1'])){ unset( $routes->data['routes']['/lead/v1'] ); } return $routes; });

  • Илья Петров, рад, что помог. отметьте решением
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Виктор Sys Ответ

Чтобы скрыть конкретный REST API route из общего индекса /wp-json/, обычно достаточно параметра show_in_index => false при регистрации маршрута. Это скрывает маршрут из списка, но не запрещает обращаться к нему напрямую.

register_rest_route('bitrix24/v1', '/lead', [
    'methods' => 'POST',
    'callback' => 'my_create_lead',
    'permission_callback' => '__return_true',
    'show_in_index' => false,
]);

register_rest_route('bitrix24/v1', '/lead', [ 'methods' => 'POST', 'callback' => 'my_create_lead', 'permission_callback' => '__return_true', 'show_in_index' => false, ]);

Если нужно скрыть namespace /bitrix24/v1 из корневого индекса, одного route может быть мало: WordPress всё равно может показывать namespace, если внутри него есть маршруты. Тогда можно отфильтровать индекс:

add_filter('rest_index', function ($response) {
    $data = $response->get_data();
 
    unset($data['routes']['/bitrix24/v1']);
    unset($data['routes']['/bitrix24/v1/lead']);
 
    if (!empty($data['namespaces'])) {
        $data['namespaces'] = array_values(array_diff($data['namespaces'], ['bitrix24/v1']));
    }
 
    $response->set_data($data);
    return $response;
});

add_filter('rest_index', function ($response) { $data = $response->get_data(); unset($data['routes']['/bitrix24/v1']); unset($data['routes']['/bitrix24/v1/lead']); if (!empty($data['namespaces'])) { $data['namespaces'] = array_values(array_diff($data['namespaces'], ['bitrix24/v1'])); } $response->set_data($data); return $response; });

Но важно понимать: скрытие из индекса не является защитой. Любой, кто знает URL, сможет обратиться к route, если permission_callback разрешает доступ. Для приватного маршрута обязательно проверяйте nonce, подпись, токен, IP или права пользователя.

То есть show_in_index — это косметика. Безопасность делается через permission_callback и валидацию входящих данных.

Если маршрут принимает лиды из внешнего сервиса, лучше использовать секретный токен в заголовке или HMAC-подпись тела запроса. Тогда даже если URL кто-то увидит, он не сможет отправлять мусорные заявки. Логи ошибок тоже нужны: скрытый route сложнее отлаживать, поэтому записывайте неуспешные запросы без персональных данных.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно