我的服务器上托管了几个网站。如果你直接输入服务器的 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>