Установить HTTP-заголовок типа контента для страницы 404 в TYPO3 9.5 - PullRequest
1 голос
/ 10 октября 2019

Я делаю веб-сервис, используя TYPO3. Все в интерфейсе должно быть JSON с HTTP-заголовком Content-Type: application/json, однако я не могу изменить заголовок Content-Type для страницы 404. Что бы я ни пытался, это всегда Content-Type: text/html; charset=utf-8. Как я могу это изменить?

Это моя основная page конфигурация TypoScript:

page = PAGE
page {
  config {
    disableAllHeaderCode = 1
    disablePrefixComment = 1
    xhtml_cleaning = 0
    admPanel = 0
  }
  10 = USER
  10 {
    userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
    extensionName = MyExt
    pluginName = MyPlugin
    vendorName = MyVendor
  }
}

Расширение использует TYPO3\CMS\Extbase\Mvc\View\JsonView.

Я уже пробовал добавитьзаголовок с использованием config.additionalHeaders.10.header = Content-Type: application/json. Я также попытался установить [FE][pageNotFound_handling] в USER_FUNCTION:... и установить заголовки в PHP.

1 Ответ

1 голос
/ 10 октября 2019

Я нашел решение сам. Начиная с TYPO3 9.5, обработка по умолчанию не найденной страницы может быть переопределена в конфигурации сайта:

errorHandling:
  -
    errorCode: 404
    errorHandler: PHP
    errorPhpClassFQCN: Vendor\MyExt\PageErrorHandler\PageNotFoundHandler

И в EXT: MyExt / Classes / PageErrorHandler / PageNotFoundHandler.php:

<?php
namespace Vendor\MyExt\PageErrorHandler;

/*
 * This file is part of the TYPO3 CMS project.
 *
 * It is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License, either version 2
 * of the License, or any later version.
 *
 * For the full copyright and license information, please read the
 * LICENSE.txt file that was distributed with this source code.
 *
 * The TYPO3 project - inspiring people to share!
 */

use GuzzleHttp\Psr7\Response;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Core\Error\PageErrorHandler\PageErrorHandlerInterface;

/**
 * Class PageNotFoundHandler
 */
class PageNotFoundHandler implements PageErrorHandlerInterface
{
    /**
     * Handle page error
     *
     * @param ServerRequestInterface $request
     * @param string $message
     * @param array $reasons
     * @return ResponseInterface
     */
    public function handlePageError(ServerRequestInterface $request, string $message, array $reasons = []): ResponseInterface
    {
        $response = new Response(404, ['Content-Type' => 'application/json'], '{"error":"Not found"}');
        return $response;
    }
}
...