Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Https 网页如何向本地网络发送消息_Https_Websocket_Cross Domain_Mixed Content - Fatal编程技术网

Https 网页如何向本地网络发送消息

Https 网页如何向本地网络发送消息,https,websocket,cross-domain,mixed-content,Https,Websocket,Cross Domain,Mixed Content,我们的web应用程序有一个按钮,用来将数据发送到本地网络上的服务器,然后服务器在打印机上打印数据 到目前为止,这很容易:该按钮触发了一个对http://printerserver/print.php使用令牌,该页面连接到web应用程序,以验证令牌并获取要打印的数据,然后再打印 然而,我们现在通过HTTPs交付我们的web应用程序(对此我不想回到HTTP),更新版本的Chrome和Firefox不再向HTTP地址发出请求,它们甚至不发送检查CORS头的请求 现在,什么是跨协议XHR的现代替代方案?

我们的web应用程序有一个按钮,用来将数据发送到本地网络上的服务器,然后服务器在打印机上打印数据

到目前为止,这很容易:该按钮触发了一个对
http://printerserver/print.php
使用令牌,该页面连接到web应用程序,以验证令牌并获取要打印的数据,然后再打印

然而,我们现在通过HTTPs交付我们的web应用程序(对此我不想回到HTTP),更新版本的Chrome和Firefox不再向HTTP地址发出请求,它们甚至不发送检查CORS头的请求

现在,什么是跨协议XHR的现代替代方案?WebSocket也有同样的问题吗?(谷歌搜索没有弄清楚这里的当前状态。)我已经可以使用TCP套接字了吗?我也不希望切换到获取请求,因为该操作不是幂等的,并且它可能会对预加载和缓存产生实际影响


我可以以任何方式更改printerserver上的应用程序(因此我可以用NodeJS或其他东西替换它),但我不能更改用户的浏览器(例如,信任printerserver的自签名证书).

您可以将打印请求存储在Web服务器的队列中,并让printserver定期轮询打印请求

如果不可能,我会在Web服务器和printserver网络之间设置一个隧道或VPN。这样,您就可以从服务器端的Web服务器而不是客户端发出打印请求。如果使用curl,则会有一些标志忽略无效的SSL证书等(我仍然认为引入队列更好,这样打印请求就不会阻塞)

如果Web服务器可以与printserver所在网络上的某个对象建立ssh连接,则可以执行如下操作:ssh paramsuser@host这里有一些卷曲命令

我可以想到的第三种选择是,如果printserver可以绑定到Web服务器域的子域,例如:print.somedomain.com,那么您可以使它受somedomain.com证书的信任,IIRC您必须从printserver证书创建CSR(证书签名请求),并使用somedomain.com证书对其进行签名。也许它本身甚至不需要是子域,但这可能是浏览器在客户端实现的要求。

  • 承载https webapp的服务器可以反向代理打印服务器, 但由于打印机是用户本地的,因此可能无法工作
  • 打印服务器应具有正确的CORS标头

    Access-Control-Allow-Origin: *
    
    或:


但是。

最简单的方法是向webapp添加一个路由,该路由只会将请求转发到打印服务器。因此,向
https://myapp.com/print
,以及向
http://printerserver/print.php
,与它自己收到的帖子内容完全相同。正如@dnozay所说,这通常被称为一个。是的,要做到这一点,您必须重新配置printserver以接受来自Web服务器的(经过身份验证的)请求

或者,您可以将printserver切换到https,并直接从客户端调用它


请注意,安全(https)页面上的不安全(http)web套接字连接也不会。还有一个很好的理由:一般来说,通过在人们看来是安全的页面上建立不安全的连接来误导人们是一个坏主意。

根据我从问题中了解到的情况,printserver无法从web应用程序访问,因此反向代理解决方案在这里不起作用

跨源策略限制您从浏览器向printserver发出请求

如果希望通过HTTPS页面与printserver通信,则需要printserver将print.php公开为HTTPS

您可以创建DNS a记录作为web应用程序的子域,该子域解析为printserver的内部地址


有了这些步骤,您应该能够更新printserver页面,以响应允许的CORS标题,然后浏览器应该尊重这些标题。我认为浏览器甚至不会在没有TLD的情况下跨不同协议方案(HTTPS vs HTTP)或向内部域发出CORS请求。

只是一个想法,但您是否尝试过使用CURL发出请求?因为CURL有自己的会话,所以它不应该受到浏览器行为的影响。我想从这个问题中可以清楚地看到:机器打印机服务器和用户的浏览器在一个网络中,web服务器在internet上。如果我理解正确,您正试图从HTTPS网站调用“”。尝试在443端口运行“”服务器-以支持HTTPS,因此您的呼叫将使用相同的协议。我不明白这是怎么可能的,因为我不明白,您是在谈论服务器到服务器的通信吗?应用程序的Web服务器无法到达printerserver计算机的地址。请共享有关您的服务器(用于Web应用程序的服务器)的详细信息?你能分享一下你的打印机/型号吗?可能还有其他解决方案不需要处理CORS。我已经在存储这些请求,printerserver已经连接到Web服务器以获取其数据。我只需要让浏览器告诉printerserver这样做,这样打印就会在单击几秒钟后发生。你的最后一段似乎很有趣,但对我来说太模糊了。printserver不能自己决定何时打印吗?如果您将需要在Web服务器上执行的所有操作都存储在Web服务器上,并且printserver会每隔X秒检查Web服务器是否有任何应执行的任务。打印完成后,它可以发送命令将其从Web服务器队列中删除。
Access-Control-Allow-Origin: https://www.example.com