Я хочу ограничить прямой IP-доступ к моему сайту. Я нашел несколько решений, связанных с .htaccess, но ни одно из них не работает. Я также нашел одно решение через конфигурацию виртуальных хостов apache, которая работала нормально до тех пор, пока я не установил сертификат SSL через CPanel. Я понятия не имею, что было изменено в файле 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 и имена были заменены на родовые. Часть «Перенаправить 403 /» не работает с момента установки SSL-сертификата. Буду признателен, если кто-нибудь сможет пролить свет на то, что я здесь делаю не так. Спасибо.
И вуаля, исправление:
<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-доступ.
Ответ мог быть намного проще.
Просто скопируйте это в нижнюю часть 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, он может получить доступ к серверу.
Вы не можете отключить прямой IP-доступ к вашему серверу через HTTPS, потому что имя хоста для вашего виртуального хоста зашифровано внутри сертификата SSL.
Клиенты должны подключиться к вашему IP-адресу, загрузить сертификат, прочитать содержимое, а затем они смогут проверить правильность имени хоста.
Единственный другой способ - принудить SNI, но вы создадите проблемы для пользователей, которые просматривают более старые версии Internet Explorer.
https://192.168.1.1
должна иметь ошибку SSL (потому что URL отличается от сертификата).<VirtualHost *:443> SSLEngine on </VirtualHost>
В установке Apcahe с несколькими .conf
файлов, приоритет отдается первому загруженному файлу, а затем второму… аналогично. Итак, если вы используете 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>
Я верю, что это то, что ты ищешь
Чтобы добавить еще один ответ, mod_security, если вам стоит его настроить, имеет правила, запрещающие доступ к серверу по IP-адресу.
Это может быть легко, если вы не поместите свои файлы в каталог по умолчанию / 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
Я написал этот простой код на 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 файл и наслаждайтесь!