Apache-仅在特定域上监听,而不是IP


Answers:


25

您不能让它拒绝连接,因为在客户端实际发送HTTP请求之前,服务器不知道用户尝试用作其HTTP主机的主机名(或IP)。TCP侦听器始终绑定到IP地址。

可以接受HTTP错误响应吗?

<VirtualHost *:80>
    ServerName catchall
    <Location />
        Order allow,deny
        Deny from all
    </Location>
</VirtualHost>

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/
    <Directory /var/www/>
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
</VirtualHost>

好吧,thin发出了403禁止来自非域的请求,这对我来说还不错。但是,我希望这些请求的服务器“不存在”。我确定这可以通过某种方式完成,也许不是使用apache,而是在系统级别?
2014年

3
@Alex不,这是完全不可能的。必须先建立TCP连接,并且客户端必须发送其HTTP请求(或我的SNI标头),然后服务器才能确定他们是否要尝试在其HTTP请求中访问域名或IP地址。
Shane Madden 2014年

@ShaneMadden完全不可能吗?我知道服务器在选择使用该服务器之前需要知道用户的IP,但是,一旦知道了它的身份,就完全不可能不响应此命中?服务器不能只是挂起连接直到超时?
HelpingHand 2014年

3
@HelpingHand不是用户的IP。服务器需要知道用户将在HTTP请求中发送的主机标头,直到完全建立TCP连接后才知道。
Shane Madden 2014年

1
@HelpingHand不,它不了解连接中发生的HTTP通信。
Shane Madden 2014年

0

您必须走到较低的层次,这才让我想到防火墙链中有一个对REQUEST HOST的验证检查,以及您对Apache的了解,这将使该软件包被忽略或丢弃


不过,完全有可能在apache级别执行此操作,因此这太过分了。一种简单的方法是确保第一个虚拟主机是一个以HTTP友好方式拒绝访问的包。
Paul Dixon

0

一种干净的方法是使用RewriteRule,如下所示

<If "%{HTTP_HOST} == 'x.x.x.x'">
  RewriteRule ^.*$ http://www.example.com/$1 [L]
</If>
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.