TYPO3 中的 realurl、重定向和缓存问题
Issue with realurl, redirect and caching in TYPO3
此错误发生在带有 piBase 扩展名和 realurl 2.0.15 的 TYPO3 7.6.10 中:
在此扩展中,我正在检查 GET 参数,例如一个国家。如果未提供此参数,我将重定向到同一页面,默认国家/地区作为参数:
if(!$this->piVars['country']) {
$this->piVars['country'] = 'germany';
\TYPO3\CMS\Core\Utility\HttpUtility::redirect($this->pi_linkTP_keepPIvars_url(array(), true), \TYPO3\CMS\Core\Utility\HttpUtility::HTTP_STATUS_303);
}
也就是说,访问者例如调用 url www.mypage.com/list/ 并重定向到 www.mypage.com/list/germany/
这工作正常,但一段时间后,一些访问者访问了该页面,重定向停止工作。在浏览器中打开 www.mypage.com/list/ 时,会显示某个国家/地区的页面(不是默认国家/地区,例如国家/地区 "france")。这意味着,TYPO3 在页面 www.mypage.com/list/france/ 上创建了页面 www.mypage.com/list/ 的缓存条目,但是对于此 url,缓存由于重定向,条目应该永远不会被创建。
我可以通过将页面的缓存时间设置为 1 分钟来重现此错误。然后我等一分钟,然后加载 url www.mypage.com/list/france/。现在,当打开 www.mypage.com/list/ 时,没有重定向并且显示法国。
禁用 realurl(或仅从 realurl 配置中删除参数 "country")时,不会发生此错误。
TYPO3 在缓存中存储了所谓的 "versions" 页面,其中包含相应的 cHash 以及没有 cHash 的版本 - 类似于 "default" 页面。
如果发生错误,当核心验证 cHash 时,它会被拒绝并生成页面,使用 url 中提供的参数。
如果第一次命中(缓存为空)并生成错误的 cHash 页面,使用来自 URL 的参数,但由于错误的 cHash,此版本随后被理解为 "default" 并存储在缓存中。
您需要在代码中找到真正的原因。它可能是 RealURL 配置和代码的错误组合。
例如。 enableCHashCache 在 RealURL 配置中设置为 false
,但 link 提供 w/out cHash.
我不能告诉你确切的原因,但你可以通过不同的方式检查:
在Install Tool中设置FE - pageNotFoundOnCHashError
,查看是否出现404错误,访问www.mypage.com/list/france/
禁用 RealURL 并访问具有不同 country
值的页面的不同版本 - cHash
是针对不同的国家发生变化还是保持不变?
检查由 pi_linkTP_keepPIvars_url()
生成的 url,有无 RealURL。是否包含cHash
?
问题描述如下:realurl generates entries without cHash
从2.0.15版本开始,realurl不计算链接的cHash参数,直接访问需要cHash参数来显示正确的缓存内容,如记录的详细页面。
此错误发生在带有 piBase 扩展名和 realurl 2.0.15 的 TYPO3 7.6.10 中:
在此扩展中,我正在检查 GET 参数,例如一个国家。如果未提供此参数,我将重定向到同一页面,默认国家/地区作为参数:
if(!$this->piVars['country']) {
$this->piVars['country'] = 'germany';
\TYPO3\CMS\Core\Utility\HttpUtility::redirect($this->pi_linkTP_keepPIvars_url(array(), true), \TYPO3\CMS\Core\Utility\HttpUtility::HTTP_STATUS_303);
}
也就是说,访问者例如调用 url www.mypage.com/list/ 并重定向到 www.mypage.com/list/germany/
这工作正常,但一段时间后,一些访问者访问了该页面,重定向停止工作。在浏览器中打开 www.mypage.com/list/ 时,会显示某个国家/地区的页面(不是默认国家/地区,例如国家/地区 "france")。这意味着,TYPO3 在页面 www.mypage.com/list/france/ 上创建了页面 www.mypage.com/list/ 的缓存条目,但是对于此 url,缓存由于重定向,条目应该永远不会被创建。
我可以通过将页面的缓存时间设置为 1 分钟来重现此错误。然后我等一分钟,然后加载 url www.mypage.com/list/france/。现在,当打开 www.mypage.com/list/ 时,没有重定向并且显示法国。
禁用 realurl(或仅从 realurl 配置中删除参数 "country")时,不会发生此错误。
TYPO3 在缓存中存储了所谓的 "versions" 页面,其中包含相应的 cHash 以及没有 cHash 的版本 - 类似于 "default" 页面。
如果发生错误,当核心验证 cHash 时,它会被拒绝并生成页面,使用 url 中提供的参数。
如果第一次命中(缓存为空)并生成错误的 cHash 页面,使用来自 URL 的参数,但由于错误的 cHash,此版本随后被理解为 "default" 并存储在缓存中。
您需要在代码中找到真正的原因。它可能是 RealURL 配置和代码的错误组合。
例如。 enableCHashCache 在 RealURL 配置中设置为 false
,但 link 提供 w/out cHash.
我不能告诉你确切的原因,但你可以通过不同的方式检查:
在Install Tool中设置
FE - pageNotFoundOnCHashError
,查看是否出现404错误,访问www.mypage.com/list/france/禁用 RealURL 并访问具有不同
country
值的页面的不同版本 -cHash
是针对不同的国家发生变化还是保持不变?检查由
pi_linkTP_keepPIvars_url()
生成的 url,有无 RealURL。是否包含cHash
?
问题描述如下:realurl generates entries without cHash
从2.0.15版本开始,realurl不计算链接的cHash参数,直接访问需要cHash参数来显示正确的缓存内容,如记录的详细页面。