我正在建立一个基于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中的某些内容)。相反,它似乎根本没有发送任何回应。
您共享的代码仅侦听端口80 - HTTP端口。它无法响应HTTPS请求,因为HTTPS使用端口443。
首先,除了端口80之外,您还需要侦听端口443。
在端口443上打开连接后,您需要运行TLS(传输层安全性,“HTTPS”中的“S”)并协商安全连接,然后才能开始通过安全连接处理HTTP。
NodeMCU确实有一个TLS library,但它似乎只是作为客户端运行,而不是服务器,所以除非你能找到其他人这样做你自己在这里,这是一个很大的项目。
假设您正常工作,任何连接到“强制网络门户”的浏览器都会左右抛出SSL证书错误,因为您的服务器正在执行TLS旨在防止的行为 - 冒充其他网站。您将无法使用证书证明您是www.google.com,因此浏览器会强烈建议用户发生不良事件并且不应继续操作。
从根本上说,首先,你没有得到任何HTTPS答案的原因是你没有收听HTTPS端口。