Все мои перенаправления http> https работают отлично.
Я установил отдельный субдомен и порт для использования с PHPMyAdmin для доступа к базе данных MySQL, поэтому вероятность того, что она будет сканироваться ботами и т. Д., Будет меньше. Примеры ниже предназначены только для демонстрационных целей.
У меня возникла проблема. если я введу порт, используемый в поддомене PHPMyAdmin
после основного домена без префикса https, чтобы он стал http://example.com:8080
, после того, что начинается как веб-страница таймаута, она в конечном итоге перенаправляет меня на сайт https, но в субдомене по адресу https://phpmyadmin.example.com:8081
.
Как мне остановить перенаправление основного домена на субдомен, а вместо этого тайм-аут, как на обычном сервере? Если кто-то угадывает каждый порт в основном домене, кто-то в конечном итоге найдет поддомен.
/etc/apache2/sites-enabled/example.com
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
ServerAdmin webmaster@example.com
Redirect permanent / https://example.com
DocumentRoot /var/www/example.com
# <Directory />
# DirectoryIndex index.html index.php
# Require all denied
# Options FollowSymLinks
# AllowOverride All
# </Directory>
#ErrorLog ${APACHE_LOG_DIR}/error.log
#CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/example.com
# <Directory />
# DirectoryIndex index.html index.php
# Require all denied
# Options FollowSymLinks
# AllowOverride All
# </Directory>
#ErrorLog ${APACHE_LOG_DIR}/error.log
#CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine On
SSLCertificateFile "/etc/ssl/certs/example.com.crt"
SSLCertificateKeyFile "/etc/ssl/private/example.com.key"
SSLCertificateChainFile "/etc/ssl/certs/example.com.ca-bundle"
</VirtualHost>
/etc/apache2/sites-enabled/phpmyadmin.example .com
<VirtualHost *:8080>
ServerName phpmyadmin.example.com
ServerAlias phpmyadmin.example.com
Redirect permanent / https://phpmyadmin.example.com:8081
</VirtualHost>
<VirtualHost *:8081>
ServerName phpmyadmin.example.com
ServerAlias phpmyadmin.example.com
DocumentRoot /usr/share/phpmyadmin
# RewriteEngine On
# RewriteCond %{HTTPS} off
# RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
<Directory />
Require all denied
Options FollowSymLinks
AllowOverride All
</Directory>
LogLevel notice
CustomLog /var/log/apache2/access.log combined
ErrorLog /var/log/apache2/error.log
Include /etc/phpmyadmin/apache.conf
SSLEngine On
SSLCertificateFile "/etc/letsencrypt/live/phpmyadmin.example.com/cert.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/phpmyadmin.example.com/privkey.pem"
SSLCertificateChainFile "/etc/letsencrypt/live/phpmyadmin.example.com/chain.pem"
</VirtualHost>
ОБНОВЛЕНИЕ 1
Я думаю, что проблема вообще между переадресацией http на https. Вместо этого вводя HTTP-порт для поддомена в основной домен, VirtualHost Apache видит, что это инициатор для перенаправления http на https, но полностью игнорирует, что домен должен это делать. Есть ли способ изолировать переадресацию http на https в зависимости от префиксов домена?
ОБНОВЛЕНИЕ 2
Существуют ли какие-либо правила / условия перезаписи, которые я мог бы использовать на каждом из виртуальных хостов http, чтобы отвечать только на порт, который он слушает? Мои знания правил перезаписи и т. Д. Отсутствуют, поэтому я полагаюсь на хорошие исследовательские навыки Google, чтобы найти мне сайты для записи. Я наткнулся на это.
RewriteEngine On
RewriteCond %{HTTP_HOST} ^yourdomain\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [R,L]
ОБНОВЛЕНИЕ 3
Я устранил проблему.
Однако, если мне нужно было получить доступ к URL-адресу примера http://example.com:8080
я получить сообщение об ошибке 403 запрещено
Forbidden
You don't have permission to access this resource.
Как мне заставить Apache отключать соединение по таймауту, а не просто полностью отказываться от него?
Теперь два файла VirtualHost становятся следующими:
/ etc / apache2 / sites-enabled / example. com
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/example.com
RewriteEngine On
RewriteCond %{HTTP_HOST} example.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com$1 [R,L]
<Directory />
DirectoryIndex index.html index.php
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/example.com
<Directory />
DirectoryIndex index.html index.php
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine On
SSLCertificateFile "/etc/ssl/certs/example.com.crt"
SSLCertificateKeyFile "/etc/ssl/private/example.com.key"
SSLCertificateChainFile "/etc/ssl/certs/example.com.ca-bundle"
</VirtualHost>
/etc/apache2/sites-enabled/phpmyadmin.example.com
<VirtualHost *:8080>
ServerName phpmyadmin.example.com
ServerAlias phpmyadmin.example.com
RewriteEngine On
RewriteCond %{HTTP_HOST} phpmyadmin.example.com [NC]
RewriteCond %{SERVER_PORT} 8080
RewriteRule ^(.*)$ https://phpmyadmin.example.com:8081$1 [R,L]
</VirtualHost>
<VirtualHost *:8081>
ServerName phpmyadmin.example.com
ServerAlias phpmyadmin.example.com
DocumentRoot /usr/share/phpmyadmin
<Directory />
DirectoryIndex index.html index.php
</Directory>
LogLevel notice
CustomLog /var/log/apache2/access.log combined
ErrorLog /var/log/apache2/error.log
Include /etc/phpmyadmin/apache.conf
SSLEngine On
SSLCertificateFile "/etc/letsencrypt/live/phpmyadmin.example.com/cert.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/phpmyadmin.example.com/privkey.pem"
SSLCertificateChainFile "/etc/letsencrypt/live/phpmyadmin.example.com/chain.pem"
</VirtualHost>
лично я бы предпочел решение, использующее либо брандмауэр, либо переадресацию портов ssh и локальный хост, чтобы безопасно предоставлять службу phpmyadmin доверенным хостам и определенно использовать достойную аутентификацию, а не « безопасность безвестности». Однако, чтобы попытаться ответить на поставленный вопрос...
Поскольку у вас есть только один виртуальный хост на каждом порту, первый определенный становится по умолчанию для запросов к этому порту, независимо от того, какое доменное имя устанавливается в ServerName и ServerAlias.
<VirtualHost *:8080>
ServerName phpmyadmin.example.com
ServerAlias phpmyadmin.example.com
Redirect permanent / https://phpmyadmin.example.com:8081/
</VirtualHost>
Это сопоставит любой запрос с *:8080, в том числе:
и перенаправит их на служба на порту 8081.
Чтобы различать запросы, я бы добавил второй VirtualHost на порту 8080, который ловит все остальное (включая http://example.com:8080) и перенаправляет его где-то не существует, что может привести к тайм-ауту.
<VirtualHost *:8080>
ServerName example.com
# redirect to somewhere non-existing will cause timeout
Redirect permanent / https://192.168.99.99/
</VirtualHost>
<VirtualHost *:8080>
ServerName phpmyadmin.example.com
ServerAlias phpmyadmin.example.com
Redirect permanent / https://phpmyadmin.example.com:8081/
</VirtualHost>
(обратите внимание, что значение по умолчанию должно стоять первым)
Примечание:
Как остановить перенаправление основного домена на поддомен и вместо тайм-аута, как это сделал бы обычный сервер?
К сожалению, к тому времени, когда apache получает запрос и обрабатывает его, точка, в которой он может определить, направлен ли запрос на http://phpadmin.example.com:8080 или http://example.com:8080, для самого apache уже слишком поздно разорвать начальное соединение и вызвать тайм-аут.
Я обычно использую для этой цели брандмауэр, либо непосредственно в iptables, либо в ufw/firewalld, в зависимости от вашего дистрибутива, чтобы ограничить доступ к порту 8080 только известными доверенными хостами.
Похоже, можно использовать модуль mod_security для имитации тайм-аута: https://serverfault.com/a/401592/47650
что-то вроде этого отправит пакет FIN для разрыва соединения после обработки заголовка запроса...
<VirtualHost *:8080>
ServerName example.com
SecRuleEngine On
SecAction id:1,phase:1,nolog,drop
</VirtualHost>
<VirtualHost *:8080>
ServerName phpmyadmin.example.com
ServerAlias phpmyadmin.example.com
Redirect permanent / https://phpmyadmin.example.com:8081/
</VirtualHost>
https://github. com/SpiderLabs/ModSecurity/wiki/Reference-Manual-%28v2.x%29#drop