通过调制解调器上的端口转发来自 Web 服务器的无效 HTTP 响应
Invalid HTTP response from webserver through port forward on modem
我目前正在构建一个嵌入式设备,该设备使用开源 light-weight IP 包 (lwIP) 来为使用 html 文件和 http 请求的客户端托管静态网络服务器。 lwIP 与普通网络服务器有些不同,因为它是简单的骨架并配置为通过 NOSYS 声明提供这些文件。
在一个极其简单的场景中,我正在尝试托管此文件 (index.html
):
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
Hello
</body>
</html>
当我直接连接到嵌入式设备时,我从有效的网络服务器得到 headers,如下所示:
Host: 192.168.168.10
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
我可以正常查看页面。
但是,如果我尝试通过端口转发到嵌入式设备的调制解调器,我在 Firefox 上尝试查看时会收到以下错误 index.html
:
The character encoding of the plain text document was not declared. The document will render with garbled text in some browser configurations if the document contains characters from outside the US-ASCII range.
The character encoding of the file needs to be declared in the transfer protocol or file needs to use a byte order mark as an encoding signature.
奇怪的是 headers 仍然相同(只是不同的 ip 和端口):
Host: 192.168.2.31:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
响应数据还是和上面的index.html
一样
我不明白是什么导致了错误,因为标签中指定了内容类型。
您粘贴的是您的浏览器发送到服务器的请求 header。问题在于嵌入式服务器发回的 response headers。特别是 Content-Type header 不正确。它应该看起来像:
Content-Type: text/plain; charset=us-ascii
如果您看不到在嵌入式应用程序中添加它们的位置,您可以在页面中使用 <meta http-equiv="Content-Type" content="...">
解决此问题。
您可以尝试将 <meta charset="UTF-8">
放入 HTML 文档的 <head>
中,它可能会解决问题。
此问题已通过使用 Tom Vs curl -v
针对服务器的建议得到解决。这给出了 Received HTTP/0.9 when not allowed
.
的响应
查看 lwipopts.h
中 LWIP 的配置时,LWIP_HTTPD_DYNAMIC_HEADERS
设置为 0。应将其设置为 1 以启用从 lwIP 生成的 headers 并设置给用户。
我目前正在构建一个嵌入式设备,该设备使用开源 light-weight IP 包 (lwIP) 来为使用 html 文件和 http 请求的客户端托管静态网络服务器。 lwIP 与普通网络服务器有些不同,因为它是简单的骨架并配置为通过 NOSYS 声明提供这些文件。
在一个极其简单的场景中,我正在尝试托管此文件 (index.html
):
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
Hello
</body>
</html>
当我直接连接到嵌入式设备时,我从有效的网络服务器得到 headers,如下所示:
Host: 192.168.168.10
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
我可以正常查看页面。
但是,如果我尝试通过端口转发到嵌入式设备的调制解调器,我在 Firefox 上尝试查看时会收到以下错误 index.html
:
The character encoding of the plain text document was not declared. The document will render with garbled text in some browser configurations if the document contains characters from outside the US-ASCII range.
The character encoding of the file needs to be declared in the transfer protocol or file needs to use a byte order mark as an encoding signature.
奇怪的是 headers 仍然相同(只是不同的 ip 和端口):
Host: 192.168.2.31:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
响应数据还是和上面的index.html
一样
我不明白是什么导致了错误,因为标签中指定了内容类型。
您粘贴的是您的浏览器发送到服务器的请求 header。问题在于嵌入式服务器发回的 response headers。特别是 Content-Type header 不正确。它应该看起来像:
Content-Type: text/plain; charset=us-ascii
如果您看不到在嵌入式应用程序中添加它们的位置,您可以在页面中使用 <meta http-equiv="Content-Type" content="...">
解决此问题。
您可以尝试将 <meta charset="UTF-8">
放入 HTML 文档的 <head>
中,它可能会解决问题。
此问题已通过使用 Tom Vs curl -v
针对服务器的建议得到解决。这给出了 Received HTTP/0.9 when not allowed
.
查看 lwipopts.h
中 LWIP 的配置时,LWIP_HTTPD_DYNAMIC_HEADERS
设置为 0。应将其设置为 1 以启用从 lwIP 生成的 headers 并设置给用户。