限制直接IP访问网站


13

我想限制对我的网站的直接IP访问。我发现了涉及.htaccess的几种解决方案,但是没有用。我还通过apache虚拟主机配置找到了一种解决方案,该解决方案在我通过CPanel安装SSL证书之前一直工作良好。我完全不知道httpd.conf文件中所做的更改,但是即使卸载SSL证书,重定向设置也无法使用。

这是我当前的虚拟主机设置:

NameVirtualHost 192.168.1.1:80 NameVirtualHost *

<VirtualHost 192.168.1.1:80>
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /home/rotate/public_html
    ServerAdmin me@mysite.com
    UseCanonicalName Off

    ## User rotate # Needed for Cpanel::ApacheConf
    UserDir disabled
    UserDir enabled rotate
    ScriptAlias /cgi-bin/ /home/rotate/public_html/cgi-bin/
</VirtualHost>

<VirtualHost 192.168.1.1:80>
    ServerName 192.168.1.1
    Redirect 403 /
    ErrorDocument 403 "Sorry, direct IP access not allowed."
    DocumentRoot /usr/local/apache/htdocs
    ServerAdmin me@mysite.com
    UseCanonicalName Off
    UserDir disabled
</VirtualHost>

<VirtualHost *>
    ServerName server.mysite.com
    DocumentRoot /usr/local/apache/htdocs
    ServerAdmin me@mysite.com
    UserDir disabled
</VirtualHost>

NameVirtualHost 192.168.1.1:443
<VirtualHost 192.168.1.1:443>
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /home/rotate/public_html
    ServerAdmin me@mysite.com
    UseCanonicalName Off

    UserDir disabled
    UserDir enabled rotate

    ScriptAlias /cgi-bin/ /home/rotate/public_html/cgi-bin/
    SSLEngine on
    #SSL stuff here
</VirtualHost>

IP和名称被通用名称代替。自安装SSL证书以来,“重定向403 /”部分不起作用。如果有人能阐明我在这里做错了什么,我将不胜感激。谢谢。


我猜您不必使用= ServerName 192.168.1.1
ADM

也尝试过,没有任何效果。
伊万

虚拟主机是否已重新排序?出现403错误的主机是第一个(默认)虚拟主机吗?
哈坎·林奎斯特

没有顺序没有改变。问题在添加SSL证书后开始,这意味着仅添加了最后一个。现在,如果我什至将其完全删除,它将无法再使用,因此其他方面也肯定有所更改,但似乎无法弄清楚。
伊万

这里是通过htaccess的解决方案 serverfault.com/a/171260/273980
jsHate

Answers:


12

瞧,解决方法:

<VirtualHost mysite.com:80>
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /home/rotate/public_html
    ServerAdmin me@mysite.com
    UseCanonicalName Off
</VirtualHost>

NameVirtualHost mysite.com:80
<VirtualHost 192.168.1.1:80>
    ServerName 192.168.1.1
    Redirect 403 /
    ErrorDocument 403 "Sorry, direct IP access not allowed."
    DocumentRoot /usr/local/apache/htdocs
    ServerAdmin me@mysite.com
    UseCanonicalName Off
    UserDir disabled
</VirtualHost>

<VirtualHost *>
    ServerName server.mysite.com
    DocumentRoot /usr/local/apache/htdocs
    ServerAdmin me@mysite.com
    UserDir disabled
</VirtualHost>

NameVirtualHost mysite.com:443
<VirtualHost mysite.com:443>
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /home/rotate/public_html
    ServerAdmin me@mysite.com
    UseCanonicalName Off
</VirtualHost>

解决方案是简单地用所有虚拟主机设置的域名替换IP,但需要重定向/限制直接IP访问的设置除外。


这将导致运行IE6和IE8的客户端出现问题。如果您对此表示满意,那很好。无论如何,他们应该升级其古老的浏览器。
Vasili Syrakis 2014年

6

答案可能要简单得多。

只需将其复制到httpd.conf的底部(通常位于/ etc / httpd / conf中)

<VirtualHost *:80>
ServerName localhost
Redirect 403 /
UseCanonicalName Off
UserDir disabled
</VirtualHost>

<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /var/www/html
</VirtualHost>

然后,只有访问者通过www.example.com进行访问,他才能访问服务器。


2

您不能禁用通过HTTPS对服务器的直接IP访问,因为您的虚拟主机的主机名已在SSL证书中加密。

客户端必须连接到您的IP地址,下载证书,阅读内容,然后他们才能验证主机名是否正确。

唯一的其他方法是强制执行SNI,但对于使用旧版本的Internet Explorer浏览的用户,则会造成问题。


1
  1. 您的证书可能是发给example.com的,而不是发给192.168.1.1的,也不是发给这两者的;因此,使用的访问者https://192.168.1.1应该有SSL错误(因为URL与证书的URL不同)。
  2. 您没有“默认SSL”网站 <VirtualHost *:443> SSLEngine on </VirtualHost>
  3. 您应该使用具有SNI支持的apache(有一些libSSL和Apache版本要求)来使用每个主机名SSL(请参阅在具有一个IP地址的Apache中使用多个SSL证书)


0

要添加另一个答案,mod_security(如果值得您设置)具有禁止通过ip地址访问服务器的规则。


0

如果您不将文件放在默认的/ var / www / html目录中,则这很容易。只需创建另一个目录,例如说/ web:

mkdir /web 
mkdir /web/example

复制文件并更改chown:

sudo chown -R www-data:www-data /web

然后使用以下配置创建虚拟主机:

<Directory /web/example>
  Require all granted
</Directory>

<VirtualHost *:80>

    DocumentRoot /web/example
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin webmaster@example.com

    # Force SSL, you can remove this line
    Redirect permanent / https://example.com/

    ServerAdmin webmaster@example.com

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

# If you use SSL
<IfModule mod_ssl.c>
    <VirtualHost *:443>
        DocumentRoot /web/example
        ServerName example.com
        ServerAlias www.example.com
        ServerAdmin webmaster@example.com

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # adapt this to your paths
        SSLEngine on
        SSLCertificateFile /etc/ssl/example/example_com.crt
        SSLCertificateKeyFile /etc/ssl/example/example.key
        SSLCertificateChainFile /etc/ssl/example/example_com.ca-bundle

    </VirtualHost>
</IfModule>

不要忘记启用虚拟主机,例如:

sudo a2ensite example.com.conf

0

在具有多个.conf文件的Apcahe设置中,优先级顺序是加载的第一个文件,然后是第二个。因此,如果您使用的是Ubuntu,则.conf文件将按字典顺序加载,因此将要加载的“第一个” 文件就是该目录下的000-default.conf因此,其名称为000/etc/apache2/sites-available/

因此,为了防止应用任何其他规则,我们需要将规则放在第一个文件的顶部。

您可以在该文件之前添加以下规则。

<VirtualHost *:80>
    ServerName default
    DocumentRoot /var/www/html
    #This part here, is crucial.
    <Location />
        Require all denied
    </Location>
</VirtualHost>

在Ubuntu 16.4 x64 Apache版本上进行了测试 > 2.4

如果您正在运行较低版本的Apache,请尝试将Require all denied上述代码替换为...

<Location />
    Order deny,allow
    Deny from all
</Location>

-3

我用PHP编写了此简单代码,以限制直接IP访问!

$servername =  $_SERVER['SERVER_NAME'];
if($servername == 'your-domain.com'){

}elseif($servername == 'your-domain-with-www.com'){

}else{
    die("Direct ip access not allowed!");
}

只需粘贴到您的php文件中,即可享受!


1
与其他答案相比,您能解释一下它的优点吗?
030

这是最简单的方法,可用于限制对网站的直接ip访问,而无需编辑apache设置!
马克斯·马利
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.