TYPO3 7.6:404 错误页面:HTML 包裹在数字中
TYPO3 7.6: 404 error page: HTML wrapped in numbers
我在 TYPO3 网站上创建了自己的“404 页面未找到”错误页面,并通过 /typo3conf/LocalConfiguration.php 如下实现,使用页面的 Speaking URL 路径:
return [
...
'FE' => [
...
'pageNotFound_handling' => '/page-not-found/',
]
]
现在,当我调用一个不存在的页面时,会显示错误页面,但在 HTML 源代码之前有一个 4 位字母数字(据我所知是十六进制)和它后面的“0”。示例(大多数重新加载后开始的数字不同):
37b3
<!DOCTYPE html>
...
</html>
0
调用错误页面 URL 本身时,页面会正确返回,但没有这些数字。
激活或停用 RealURL 扩展没有区别。
提前致谢!
我添加了安装工具的完整描述,我想我们可能会在那里找到解决方案。
TYPO3 应如何处理 non-existing/accessible 页面的请求。
空(默认)
显示页面树中向上的下一个可见页面。
'true' 或 '1'
显示一条错误消息。
字符串
要显示的静态 HTML 文件(使用正确的 headers 读取内容和输出),例如notfound.html
或 http://www.example.org/errors/notfound.html
.
前缀"REDIRECT:"
如果前缀为"REDIRECT:",它将重定向到前缀后的URL/script。
前缀"READFILE:"
如果以"READFILE"作为前缀,那么它期望剩余的字符串是一个HTML文件,在有标记“###CURRENT_URL#之后将被直接读取并输出##" 替换为 REQUEST_URI,###REASON### 替换为原因文本,例如:READFILE:fileadmin/notfound.html
.
前缀"USER_FUNCTION:"
如果以 "USER_FUNCTION:" 为前缀,则调用用户函数,例如USER_FUNCTION:fileadmin/class.user_notfound.php:user_notFound->pageNotFound
其中文件必须包含一个 class user_notFound
,里面有一个方法 pageNotFound()
,有两个参数 $param
和 $ref
.
您配置的内容:
你正在传递一个字符串,因此 TYPO3 期望找到一个你没有的文件,因为它更像是一个 URL.
从你试图实现的目标来看,我会选择 REDIRECT:/page-not-found/
。
感谢您顺便指出这一点,我将从核心中删除 string
配置,因为让更多人陷入这个陷阱是没有意义的。
简而言之:更改 LocalConfiguration.php 的 FE 部分中的以下行:
'pageNotFound_handling' => '/your404page.html',
至
'pageNotFound_handling' => 'REDIRECT:/your404page.html',
原因
实际原因是分块 Content-Encoding 和 TYPO3 在某些情况下无法解码的组合。在您的情况下,未找到页面处理程序最终使用 GeneralUtility::getUrl()
来检索错误页面。
如果您启用了 [SYS][curlUse]
,它将使用 cUrl 检索页面,没有问题。
如果您没有启用 [SYS][curlUse]
,它将打开一个套接字,读取 headers,然后读取其余的 body。如果网络服务器使用 "chunked" Content-Encoding,则 body 将包含数据块,每个块都以十六进制格式的行开头。内容以一个空块结尾(当然还有一行长度为“0”)。
cUrl 显然知道如何解码分块数据。
getUrl()
本身并不知道如何处理分块数据,而是按原样使用内容作为页面内容。
在 TYPO3 8 LTS 中,guzzle 库用于处理 HTTP 请求。在 guzzle 代码中,我找不到任何关于处理分块数据的信息。 Guzzle 将检查 cUrl PHP 扩展是否存在并将其用作首选传输。在大多数安装中,cUrl 是存在的,因为它会自动解码分块数据,所以没有任何问题可见。我必须使用已禁用 cUrl 的 PHP 测试 guzzle,以查看问题是否也存在于 v8/master.
中
Workaround/solution
如果在您的安装中启用了 PHP 扩展 cUrl,您只需在安装工具中设置 [SYS][curlUse]
。 404页面内容周围的数字会消失
我在 TYPO3 网站上创建了自己的“404 页面未找到”错误页面,并通过 /typo3conf/LocalConfiguration.php 如下实现,使用页面的 Speaking URL 路径:
return [
...
'FE' => [
...
'pageNotFound_handling' => '/page-not-found/',
]
]
现在,当我调用一个不存在的页面时,会显示错误页面,但在 HTML 源代码之前有一个 4 位字母数字(据我所知是十六进制)和它后面的“0”。示例(大多数重新加载后开始的数字不同):
37b3
<!DOCTYPE html>
...
</html>
0
调用错误页面 URL 本身时,页面会正确返回,但没有这些数字。
激活或停用 RealURL 扩展没有区别。
提前致谢!
我添加了安装工具的完整描述,我想我们可能会在那里找到解决方案。
TYPO3 应如何处理 non-existing/accessible 页面的请求。
空(默认)
显示页面树中向上的下一个可见页面。
'true' 或 '1'
显示一条错误消息。
字符串
要显示的静态 HTML 文件(使用正确的 headers 读取内容和输出),例如
notfound.html
或http://www.example.org/errors/notfound.html
.前缀"REDIRECT:"
如果前缀为"REDIRECT:",它将重定向到前缀后的URL/script。
前缀"READFILE:"
如果以"READFILE"作为前缀,那么它期望剩余的字符串是一个HTML文件,在有标记“###CURRENT_URL#之后将被直接读取并输出##" 替换为 REQUEST_URI,###REASON### 替换为原因文本,例如:
READFILE:fileadmin/notfound.html
.前缀"USER_FUNCTION:"
如果以 "USER_FUNCTION:" 为前缀,则调用用户函数,例如
USER_FUNCTION:fileadmin/class.user_notfound.php:user_notFound->pageNotFound
其中文件必须包含一个 classuser_notFound
,里面有一个方法pageNotFound()
,有两个参数$param
和$ref
.
您配置的内容:
你正在传递一个字符串,因此 TYPO3 期望找到一个你没有的文件,因为它更像是一个 URL.
从你试图实现的目标来看,我会选择 REDIRECT:/page-not-found/
。
感谢您顺便指出这一点,我将从核心中删除 string
配置,因为让更多人陷入这个陷阱是没有意义的。
简而言之:更改 LocalConfiguration.php 的 FE 部分中的以下行:
'pageNotFound_handling' => '/your404page.html',
至
'pageNotFound_handling' => 'REDIRECT:/your404page.html',
原因
实际原因是分块 Content-Encoding 和 TYPO3 在某些情况下无法解码的组合。在您的情况下,未找到页面处理程序最终使用 GeneralUtility::getUrl()
来检索错误页面。
如果您启用了 [SYS][curlUse]
,它将使用 cUrl 检索页面,没有问题。
如果您没有启用 [SYS][curlUse]
,它将打开一个套接字,读取 headers,然后读取其余的 body。如果网络服务器使用 "chunked" Content-Encoding,则 body 将包含数据块,每个块都以十六进制格式的行开头。内容以一个空块结尾(当然还有一行长度为“0”)。
cUrl 显然知道如何解码分块数据。
getUrl()
本身并不知道如何处理分块数据,而是按原样使用内容作为页面内容。
在 TYPO3 8 LTS 中,guzzle 库用于处理 HTTP 请求。在 guzzle 代码中,我找不到任何关于处理分块数据的信息。 Guzzle 将检查 cUrl PHP 扩展是否存在并将其用作首选传输。在大多数安装中,cUrl 是存在的,因为它会自动解码分块数据,所以没有任何问题可见。我必须使用已禁用 cUrl 的 PHP 测试 guzzle,以查看问题是否也存在于 v8/master.
中Workaround/solution
如果在您的安装中启用了 PHP 扩展 cUrl,您只需在安装工具中设置 [SYS][curlUse]
。 404页面内容周围的数字会消失