通过隧道(使用ngrok)将localhost暴露给Internet:HTTP错误400:错误的请求;无效的主机名


210

从该问题的先前版本开始,有这样一个问题:使用ip地址而不是localhost浏览网站,这大致概述了我到目前为止所做的事情……我已经在使用本地IP。然后我找到了ngrok,显然我不需要通过IP进行连接。


我想做的就是将我在本地主机上运行的网站暴露给互联网。我找到了一个可以做到这一点的工具:ngrok。

在Visual Studio中运行网站,该网站在localhost / port#上启动。我在命令行中运行命令“ ngrok http port#”。一切似乎开始正常。我生成了几个URL,并且ngrok检查URL(localhost:4040)有效。

唯一的问题是,当我转到生成的URL时,出现HTTP错误400:错误的请求无效的主机名。与我运行“ ngrok httprongport#”时,它是一个不同的错误,这是一个主机未找到的错误...所以,我认为正在发生某些事情。我无法分辨...

通过隧道服务将网站公开到互联网上,我缺少步骤吗?如果有,我在ngrok文档中找不到它。

Answers:


564

使用ngrok解决此问题。用坚不可摧的话来说,某些应用程序看到的主机标头与预期的不同时会生气。

运行以下命令应解决此问题:

ngrok http [port] -host-header="localhost:[port]"

3
谢谢。我之前遵循了Devin Rader的指示,在这里进行了详细说明,但是现在这使这种方式变得更容易。twilio.com/blog/2014/03/...
sobelito

如果在将另一个绑定添加到applicationHost.config(vs2015 / iisexpress)时遇到问题,此解决方案也可以使用。您无需添加一个即可使用此答案。最后,如果您为自定义域付费,以避免每次都更改地址,则只需在上述答案中添加-subdomain = mysubdomain即可。
trevorc

4
不能足够投票!对于所有复杂的,有漏洞的指令,它们都可以破解IISExpress绑定和网络设置,这就像黄油切入的热刀一样,贯穿了一切。
尼尔·拉斯莱特

19
当local在https而不是http上时,上述工作方式会出现这种变化:ngrok http https://localhost:44362 -host-header="localhost:44362"
Jsinh,

1
哇,我浪费了将近2个小时才弄明白这一点。我唯一的问题是我在-host-header中添加了https。像这样:ngrok http https://localhost:44392 -host-header="https://localhost:44392" 从-host-header参数中删除https://解决了我的问题。谢谢
戴夫

48

以下命令将解决此问题

ngrok http -host-header=localhost 8080

2
如果使用ASP.NET Core,还应该app.UseHttpsRedirection()在Startup类中注释掉,以避免307 Temporary Redirect。
Mark G

39

这对我不起作用。您可以执行以下操作:

对于IIS Express

在VS 2015中:转到.vs\config\applicationhost.config项目中的文件夹

在VS 2013及更早版本中:转到 %USERPROFILE%\My Documents\IISExpress\config\applicationhost.config

找到显示以下内容的绑定:

<binding protocol="http" bindingInformation="*:5219:localhost" />

对我来说,这是一个在5219端口上运行的项目

更改为

  <binding protocol="http" bindingInformation="*:5219:" />

IIS Express现在将接受该端口上的所有传入连接。

缺点:您需要以admin身份运行IIS Express。

或者您可以在Ngrok中重写主机头:

ngrok.exe http -host-header=rewrite localhost:5219

这是在ngrok中重写标头的正确方法。其他答案均无效。已经将IIS设置为任何主机名,但是当使用-host-header =“ localhost:8892”时,ngrok返回“主机名无效”,但是此重写版本可立即使用。
提斯


0

对我来说,最简单的方法是使用iisexpress-proxy + ngrok。

首先,我iisexpress-proxy使用npm进行全局安装

npm install -g iisexpress-proxy

然后用它代理我的本地主机。假设我的网站在上运行3003

iisexpress-proxy 3003 to 12345 哪里 12345我要代理到的新http端口。

然后我可以在上面运行ngrok。

./ngrok.exe http 12345

就是这样!😃

但我认为它仅适用于http。现在,我不习惯https进行测试,但是即使它可以工作,通常也像往常一样需要大量工作。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.