背景
今天有一个需求,就是想让指定HOST的http请求可以访问某个服务,但是其他HOST过来的请求无法使用HTTP协议; 查了一下NGINX中关于虚拟主机的配置信息,Nginx中关于虚拟主机的配置原理是这样的,假设现在配置了三个server,例如:server { listen 80; server_name example.org www.example.org; ... } server { listen 80; server_name example.net www.example.net; ... } server { listen 80; server_name example.com www.example.com; ... }这三个虚拟主机配置,server_name限定了访问的HOST,当example.org,example.net,example.com的host请求来临时,会访问到对应的server下的配置服务上。 当然,如果来了一个localhost,或者其他的HOST请求时,此时会访问到第一个server配置,Nginx中会默认第一个server配置为default配置。 当然,可以通过default_server来指定默认服务配置是哪一个,例如:
server { listen 80; server_name example.org www.example.org; ... } server { listen 80 default_server; server_name example.net www.example.net; ... } server { listen 80; server_name example.com www.example.com; ... }此时会使用第二个配置作为默认配置; (注:default_server从Nginx 0.8.2以后的版本有效,以前使用default关键字) OK,了解这个原理之后,上面的需求也变得非常简单了,只需要在default配置中不配置指定的服务,而将服务proxy配置到对应的虚拟主机下即可达到效果;
深入配置
如何限制不带HOST的请求?可以通过如下配置:
server { listen 80; server_name ""; return 444; }
server { listen 192.168.1.1:80; server_name example.org www.example.org; ... } server { listen 192.168.1.1:80 default_server; server_name example.net www.example.net; ... } server { listen 10.10.1.192:80 default_server; server_name example.com www.example.com; ... }上面的配置展示了监听指定IP地址+端口上的请求,当一个来自192.168.1.1:80端口上的请求来临时,如果match到了配置的HOST会按虚拟主机配置的服务进行中转,没有match则会走default配置。
值得注意的是,不同ip+端口可以有自己的default_server.
所以当配置一个内网请求的时候,可以通过指定监听IP地址的方式,通过监听内网IP+port上的请求来达到限制内网访问的目的。
没有评论:
发表评论