通过隧道将本地主机暴露在互联网上(使用ngrok):HTTP错误400:错误请求;无效的主机名。

295

这是之前版本的问题:使用IP地址而不是localhost浏览网站,大致描述了我目前所做的事情... 我已经让本地IP地址正常工作。然后我找到了ngrok,显然我不需要通过IP连接。


我想要做的是将运行在localhost上的网站暴露在互联网上。我找到了一个可以做到这一点的工具:ngrok。

在Visual Studio中运行网站,网站会在localhost/port#上启动。我在命令行中运行“ngrok http port#”命令。所有东西似乎都正常启动。我生成了几个URL,ngrok检查URL(localhost:4040)有效。

唯一的问题是当我访问生成的URLs时,我得到HTTP错误400:无效的主机名。这是一个不同的错误,与当我运行“ngrok http wrongport#”时出现的“找不到主机”错误不同......所以我认为有些好东西正在发生。 我只是不知道是什么......

在通过隧道服务将我的网站暴露在互联网上方面,我是否遗漏了某些步骤?如果有的话,在ngrok文档中我找不到。


整个过程在这里被总结了一下。或许这会有所帮助。 - umunBeing
12个回答

772
使用 ngrok 排查此问题。用 inconshrevable 的话来说,有些应用程序看到与预期不同的主机标头时会感到愤怒。
执行以下命令应该可以解决问题:
ngrok http [port] --host-header="localhost:[port]"

根据版本的不同,您可能也想尝试以下操作:

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

3
谢谢。我之前按照Devin Rader在这里详细介绍的说明操作,但现在有更简单的方法。https://www.twilio.com/blog/2014/03/configure-windows-for-local-webhook-testing-using-ngrok.html - sobelito
4
无法点赞这个足够了!尽管有许多复杂和错误的指示来黑客你的IISExpress绑定和网络设置,但这个方法像热刀切开黄油一样轻松。 - Neil Laslett
47
当本地使用https而非http时,上述命令的变化为:ngrok http https://localhost:44362 -host-header="localhost:44362"。请注意,该命令只是针对语言翻译,不包含任何解释或其他内容。 - Jsinh
3
哇,我浪费了近两个小时才弄明白这个问题。我的唯一问题是在-host-header中添加了https。像这样:ngrok http https://localhost:44392 -host-header="https://localhost:44392"从-host-header参数中删除https://解决了我的问题。谢谢。 - Pirate
3
谢谢,它在2022年仍然有效。就像 '--host-header=whatever' 一样。 - LoLo
显示剩余8条评论

72

以下命令将解决该问题

ngrok http -host-header=localhost 8080

12
如果使用 ASP.NET Core,您还应该在 Startup 类中注释掉 app.UseHttpsRedirection(),以避免出现 307 临时重定向。 - Mark G
由于某些原因,被接受的答案对我没有起作用,但这个解决方案有效。谢谢! - M1sterPl0w
1
对我没用。 - brianc

44

这个对我没用。

你可以尝试以下方法:

针对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现在将接受该端口的所有传入连接。

缺点:您需要以管理员身份运行IIS Express。

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

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

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

32

对于 https,可以这样操作:

ngrok http https://localhost:<PORT> --host-header="localhost:<PORT>"


这对我绝对有效:ngrok http --host-header=MY_DOMAIN.COM 443。 - Alejandro Giraldo

8

最新版本的更新命令

测试版本: (Windows) (ngrok v3.0.5)

使用--替代-

ngrok http --host-header=localhost 8080


2
对我来说最简单的方法是使用 iisexpress-proxy + ngrok。
首先,我用npm全局安装了iisexpress-proxynpm install -g iisexpress-proxy 然后我使用它代理本地主机。比如说我的网站运行在端口 3003 上。 iisexpress-proxy 3003 to 12345,其中 12345 是我想要代理到的新的 http 端口。
接着,我可以在上面运行ngrok。 ./ngrok.exe http 12345 它就可以工作了!
但是我认为它只能使用 http。现在我没有使用 https 进行测试,但即使它可以工作,通常也需要很多工作。

1

https 的情况下可以这样做:

ngrok http https://localhost:<PORT> --host-header="localhost:<PORT>"


我正在努力尝试弄清楚如何让它与隧道配置文件ngrok.yml一起工作。 当我搞定了,我会编辑这篇文章 :) - Pedro Dionisio

1

首先打开ngrok配置YAML文件,从终端运行:

ngrok config edit

本地主机设置(客户端和服务器)的yaml示例:

version: "2"
authtoken: {YOUR_AUTH_TOKEN_FROM_NGROK_WEBSITE}
tunnels:
 client:
  addr: 3000
  proto: http
  host_header: localhost
 server:
  addr: 4000
  proto: http
  host_header: localhost

根据您的客户端和服务器端口保存配置文件,并运行以下命令:

ngrok start --all

这将使ngrok为yaml文件中声明的所有配置打开隧道


0

尝试使用全球基础设施>位置中的不同位置

ngrok http -region eu 8080

使用ngrok流量检查器http://localhost:4040,您可以发出请求并查看通过隧道传递的任何流量。

或者在命令行中操作。

ngrok http -region eu 8080 --log=stdout                                                                                                                                                 

如果一个区域失败了,那就尝试另一个。

ngrok在世界各地的数据中心运行隧道服务器。给定区域内数据中心的位置可能会在没有通知的情况下更改(例如,欧洲服务器可能从法兰克福移动到伦敦)。

  • us - 美国(俄亥俄州)
  • eu - 欧洲(法兰克福)
  • ap - 亚太地区/太平洋地区(新加坡)
  • au - 澳大利亚(悉尼)
  • sa - 南美洲(圣保罗)
  • jp - 日本(东京)
  • in - 印度(孟买)

0

如果我安装了IIS Express .net web API,并在docker中安装了NGROK(作为主机的Windows),出现“Bad Request”错误,下一个命令对我有用:

docker run -it -e NGROK_AUTHTOKEN=<token> ngrok/ngrok --host-header=localhost:21852  http host.docker.internal:21852

后来我明白了,需要使用--host-header选项,因为IIS Express拒绝所有来自外部的请求(必须是“localhost:port”)。我使用了host.docker.internal代替localhost,因为NGROK运行在docker内部,而IIS Express运行在Windows主机上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接