You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Typo3 v9 Ajax插件直接访问返回JSON但JS异步请求为空如何解决

TYPO3 v9 Ajax插件异步请求返回空响应问题排查方案

常见原因及解决方法

  • cHash校验拦截
    即使你配置了no_cache = 1,TYPO3 v9默认仍会对携带查询参数的Extbase请求校验cHash,无有效cHash的请求会被直接拦截返回空响应,这是该场景下最高发的问题。
    解决方法:在当前Ajax页的TypoScript配置中关闭该typeNum的cHash校验:
ajaxAutocomplte_page.config {
    requireCHashArgumentForActionArguments = 0
}
// 全局配置可在LocalConfiguration.php中添加
$GLOBALS['TYPO3_CONF_VARS']['FE']['cacheHash']['excludedParameters'] = array_merge(
    $GLOBALS['TYPO3_CONF_VARS']['FE']['cacheHash']['excludedParameters'],
    ['query']
);
  • CSRF校验拦截
    如果你的请求是POST类型、或者请求方携带了TYPO3前后端登录会话,Extbase默认会校验CSRF令牌,校验失败则返回空响应。
    解决方法:在扩展的ext_localconf.php中为对应Action关闭CSRF校验,公开接口可直接将目标Action设为非缓存Action:
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
    'TYPO3.MyExt',
    'AjaxAutocomplete',
    [\Your\Namespace\Controller\TemplatesController::class => 'autocompleteJson'],
    // 第二个数组是非缓存Action列表,此处加入后默认关闭CSRF校验
    [\Your\Namespace\Controller\TemplatesController::class => 'autocompleteJson']
);
  • 跨域预检请求未处理
    如果JS发起请求的域名和TYPO3站点域名不一致,浏览器会先发送OPTIONS类型的预检请求,TYPO3默认不处理该类请求,会返回空响应,后续正式请求也会被浏览器拦截。
    解决方法:在Ajax页的TypoScript中补充CORS配置并处理OPTIONS请求:
ajaxAutocomplte_page.config.additionalHeaders {
    10.header = Content-type:application/json
    20.header = Access-Control-Allow-Origin: *
    30.header = Access-Control-Allow-Methods: GET,POST,OPTIONS
    40.header = Access-Control-Allow-Headers: *
}

// 匹配OPTIONS请求直接返回200状态码
[globalVar = TSFE:type = 111871] && [globalVar = _SERVER:REQUEST_METHOD = OPTIONS]
    ajaxAutocomplte_page.10 >
    ajaxAutocomplte_page.10 = TEXT
[global]
  • 请求参数不匹配
    你控制器中直接读取$_GET['query'],如果JS发起的是POST请求、参数放在请求体中,或者参数名拼写错误,会导致查询值为空,若仓库查询无结果可能返回空响应。
    解决方法:使用Extbase内置的参数注入获取参数,避免直接操作超全局变量,同时显式指定JsonView避免Fluid模板异常:
public function autocompleteJsonAction(string $query = '')
{
    $data = $this->templatesRepository->getAutocompleteData($query);
    $this->view = $this->objectManager->get(\TYPO3\CMS\Extbase\Mvc\View\JsonView::class);
    $this->view->setVariablesToRender(['data']);
    $this->view->assign('data', $data);
}
  • typeNum配置未生效
    确认JS请求的URL中是否正确携带type=111871参数,或者站点路由配置中是否正确映射了该typeNum的访问路径。

内容的提问来源于stack exchange,提问作者deroccha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 21:15:04