我正在建立一个基于this的强制门户。我的目标是使连接的任何人都可以重定向到ESP8266文件系统中存储的index.html页面,并从中导航到类似存储的其他页面。该代码通过在名为“ urls.txt”的文本文件中查找URL来区分外部站点和本地站点。只要用户尝试访问纯HTTP站点,一切都可以正常工作,但是在尝试访问HTTPS站点时不会重定向用户。例如,尝试连接到“ www.google.com”将失败,但是“ www.nerfhaven.com”将成功。
这是来自server.lua的一些代码:
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
local rnrn=0
local Status = 0
local DataToGet = 0
local method=""
local url=""
local vars=""
conn:on("receive",function(conn,payload)
if Status==0 then
_, _, method, url, vars = string.find(payload, "([A-Z]+) /([^?]*)%??(.*) HTTP")
-- print(method, url, vars)
end
[...]
conn:send("HTTP/1.1 200 OK\r\n\r\n")
[...]
local foundmatch = 0
file.open("urls.txt", "r")
print("potato")
for i = 108,1,-1 do
line = file.readline()
--print(line)
if string.match(line, url) then
foundmatch=1
print("found " .. url)
end
end
print("potato2")
file.close()
[...]
conn:on("sent",function(conn)
print("sending data")
if DataToGet>=0 and method=="GET" then
if file.open(url, "r") then
file.seek("set", DataToGet)
local line=file.read(512)
file.close()
if line then
conn:send(line)
-- print ("sending:" .. DataToGet)
DataToGet = DataToGet + 512
if (string.len(line)==512) then
return
end
end
end
end
conn:close()
end)
end)
我认为这应该可行,因为我看不到区分HTTP和HTTPS网站的方法,应该将其中的任何内容简单地切碎并替换为本地版本(index.html或urls.txt中的某些内容) 。相反,它似乎根本没有发送任何响应。
答案 0 :(得分:1)
您共享的代码仅在端口80(HTTP端口)上侦听。由于HTTPS使用端口443,因此它将无法响应HTTPS请求。
因此,首先,除了端口80外,您还需要监听443端口。
一旦在端口443上打开了连接,您将需要运行TLS(传输层安全性,“ HTTPS”中的“ S”)并协商安全连接,然后才能开始通过安全连接处理HTTP。 / p>
NodeMCU确实有一个TLS library,但它似乎仅作为客户端而不是服务器运行,因此,除非您找到完成此任务的其他人,否则您将独自一人在这里,这是一个很大的项目。
假设您能正常工作,那么连接到“强制门户”的任何浏览器都会左右抛出SSL证书错误,因为您的服务器正在执行TLS旨在防止的行为-模拟另一个网站。您将没有证书来证明自己是www.google.com,因此浏览器会强烈建议用户发生了某些不良情况,因此不应继续进行。
从根本上来说,首先,您没有获得HTTPS答案的原因是您没有在HTTPS端口上监听。