限制直接 IP 访问网站而不影响其他网站

限制直接 IP 访问网站而不影响其他网站

我的服务器上托管了几个网站。如果你直接输入服务器的 IP 地址,它会带你到其中一个网站,我想限制这种行为,所以我使用了以下修复方法:

<VirtualHost 192.168.1.1:80>
   ServerName 192.168.1.1
   Redirect 403 /
   ErrorDocument 403 "Forbidden"
   DocumentRoot /var/www/html
   ServerAdmin [email protected]
   UseCanonicalName Off
   #UserDir disabled
</VirtualHost>

它可以限制直接 IP 访问,但现在我的其他网站无法访问,并显示禁止消息。

我该如何改变这种情况,以便仍然禁止直接 IP 访问,但仍然可以使用其域名访问我的其他网站?

这是我的完整配置文件:

<VirtualHost *:80>
    ServerName admin.example.com
    Redirect permanent / https://admin.example.com/
</VirtualHost>

<VirtualHost 192.168.1.1:80>
   ServerName 192.168.1.1
   Redirect 403 /
   ErrorDocument 403 "Forbidden"
   DocumentRoot /var/www/html
   ServerAdmin [email protected]
   UseCanonicalName Off
   #UserDir disabled
</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName admin.example.com
        ServerAdmin [email protected]
        DocumentRoot /var/www/html

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

        Alias /static /home/user/example/static
        <Directory /home/user/example/static>
                Require all granted
        </Directory>

        <Directory /home/user/example/example>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>

        WSGIScriptAlias / /home/user/example/example/wsgi.py
        WSGIDaemonProcess example python-path=/home/user/example python-home=/home/user/example/venv
        WSGIProcessGroup example

SSLCertificateFile /etc/letsencrypt/live/admin.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/admin.example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

答案1

一种方法是要求客户端发送一个Host标头:

Require expr %{HTTP_HOST} .

可能更好的方法是为您想要支持的所有主机名定义虚拟主机,但是让第一个虚拟主机(如果没有其他主机匹配,则为默认虚拟主机)拒绝连接:

<VirtualHost *>
  Require all denied
</VirtualHost>
<VirtualHost *>
  ServerName example.com
</VirtualHost>
<VirtualHost *>
  ServerName admin.example.com
</Virtualhost>
...

答案2

参照httpd-2.4+版本,添加以下几行即可:

  <If "%{HTTP_HOST} != 'example.com' && %{HTTP_HOST} != 'www.example.com' && %{HTTP_HOST} != 'test1.example.com' && %{HTTP_HOST} != 'test2.example.com' && %{HTTP_HOST} != 'test3.example.com' && %{HTTP_HOST} != 'test4.example.com' && %{HTTP_HOST} != 'test5.example.com'" >
    Redirect 403 /
    UseCanonicalName Off
  </If>

相关内容