TYPO3配置realurl与tx_news实现标题为完整URL路径段
实现TYPO3 tx_news标题作为完整路径段的URL配置方案
我刚好处理过类似的迁移需求,结合你使用的TYPO3 v8.7.10、tx_news 6.3.0和realurl 2.3.1版本,给你一套可落地的配置方案,让新闻URL直接变成http://example.com/news-title/这种简洁格式:
1. 配置RealURL的fixedPostVars隐藏控制器/动作
首先在typo3conf/realurl_conf.php中,针对新闻列表页面的PID配置fixedPostVars,隐藏默认的detail动作和News控制器:
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['realurl'] = [ '_DEFAULT' => [ 'init' => [ 'enableCHashCache' => true, 'enableUrlDecodeCache' => true, 'enableUrlEncodeCache' => true, ], 'pagePath' => [ 'rootpage_id' => 1, // 替换成你的根页面PID ], 'fixedPostVars' => [ // 替换成你的新闻列表页面PID '123' => [ [ 'GETvar' => 'tx_news_pi1[action]', 'valueMap' => [ 'detail' => '', // 隐藏detail动作 ], 'noMatch' => 'bypass', ], [ 'GETvar' => 'tx_news_pi1[controller]', 'valueMap' => [ 'News' => '', // 隐藏News控制器 ], 'noMatch' => 'bypass', ], [ 'GETvar' => 'tx_news_pi1[news]', 'lookUpTable' => [ 'table' => 'tx_news_domain_model_news', 'id_field' => 'uid', 'alias_field' => 'title', 'addWhereClause' => 'AND NOT deleted', 'useUniqueCache' => true, 'useUniqueCache_conf' => [ 'strtolower' => true, 'spaceCharacter' => '-', ], ], ], ], ], ], ];
2. 自定义URL编码/解码回调处理路径段
上面的配置会生成类似http://example.com/news/news-title/的URL(假设新闻列表页面的slug是news),我们需要去掉中间的news/,直接让标题成为根路径下的段。这时候要用到user_encodeSpURL_postProc和user_decodeSpURL_preProc:
编码回调(生成URL时去掉列表页面路径)
在typo3conf/AdditionalConfiguration.php中添加:
// 自定义URL编码回调:去掉新闻列表页面的路径段 $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['realurl']['_DEFAULT']['postVarSets']['_DEFAULT']['user_encodeSpURL_postProc'] = function(&$params, &$ref) { // 替换成你的新闻列表页面的slug(比如"news") $newsListSlug = 'news'; // 把"/news/news-title/"替换成"/news-title/" $params['URL'] = preg_replace('#/' . preg_quote($newsListSlug, '#') . '/([^/]+)/?$#', '/$1/', $params['URL']); };
解码回调(请求标题路径时映射到新闻详情)
同样在AdditionalConfiguration.php中添加:
// 自定义URL解码回调:将标题路径映射到新闻详情 $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['realurl']['_DEFAULT']['preVars']['_DEFAULT']['user_decodeSpURL_preProc'] = function(&$params, &$ref) { $pathSegments = explode('/', trim($params['URL'], '/')); // 如果路径只有一个段(就是新闻标题) if(count($pathSegments) === 1 && !empty($pathSegments[0])) { $titleSlug = $pathSegments[0]; // 查询对应的新闻UID $query = $GLOBALS['TYPO3_DB']->SELECTquery( 'uid', 'tx_news_domain_model_news', 'REPLACE(LOWER(title), " ", "-") = "' . $GLOBALS['TYPO3_DB']->fullQuoteStr(strtolower($titleSlug), 'tx_news_domain_model_news') . '" AND NOT deleted AND NOT hidden' ); $result = $GLOBALS['TYPO3_DB']->sql_query($query); if($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result)) { // 设置对应的GET参数,指向新闻详情 $params['GET']['tx_news_pi1[action]'] = 'detail'; $params['GET']['tx_news_pi1[controller]'] = 'News'; $params['GET']['tx_news_pi1[news]'] = $row['uid']; // 清空URL路径,让RealURL处理到正确的页面 $params['URL'] = ''; // 替换成你的新闻列表页面PID $params['GET']['id'] = 123; } } };
3. .htaccess配置永久重定向(可选但推荐)
为了兼容旧的URL(比如WordPress的/news/news-title/或者TYPO3默认的/news/detail/news-title/),在.htaccess中添加301重定向规则:
# 重定向旧的TYPO3新闻URL到新格式 RewriteRule ^news/detail/([^/]+)/?$ /$1/ [R=301,L] # 重定向旧的WordPress新闻URL到新格式 RewriteRule ^news/([^/]+)/?$ /$1/ [R=301,L]
4. 关键注意事项
- 标题唯一性:确保所有新闻的标题是唯一的,否则解码时会匹配到第一个符合的新闻。如果有重复标题,建议在编码时自动添加UID后缀(比如
news-title-123),可以修改realurl的lookUpTable配置,把alias_field改成CONCAT(title, '-', uid)。 - 清除缓存:每次修改RealURL配置后,一定要清除TYPO3的页面缓存和RealURL的缓存(可以在TYPO3后台的"Flush Cache"中选择"Flush all caches")。
- 测试URL生成:在新闻列表页面点击新闻链接,检查生成的URL是否符合预期;直接访问
http://example.com/news-title/,确认能正确打开新闻详情页。
内容的提问来源于stack exchange,提问作者webman
相关产品推荐
相关产品推荐

