На нашем сервере разработки у нас есть несколько сайтов для нескольких разработчиков, работающих через vhosts в Apache 2.4.6. Мы на CentOS 7.
Мы хотим перенаправить все http: //www.site.ext.dev-username.commondomain.ext
на https: //www.site.ext .dev-username.commondomain.ext
. Здесь dev-username
и site.ext
могут меняться в зависимости от сайта разработчика и пользователя.
Ранее мы использовали что-то вроде этого:
<VirtualHost *:80>
ServerName www.site.ext.dev-username.commondomain.ext
Redirect permanent / https://www.site.ext.dev-username.commondomain.ext/
</VirtualHost>
Но возможно ли сопоставление любой (или хотя бы подстановочный знак) ServerName
и перенаправить соответственно, то есть с обратной ссылкой на регулярное выражение? Может быть, с DirectoryMatch
или чем-то вместо vhost?
Я заметил это в документации (для сопоставления каталогов и местоположений), которая, к сожалению, несовместима с моей версией Apache:
From Начиная с 2.4.8, именованные группы и обратные ссылки захватываются и записываются в среду с соответствующим именем с префиксом «MATCH_» и в верхнем регистре. Это позволяет ссылаться на элементы URL-адресов из выражений и модулей, таких как mod_rewrite. Во избежание путаницы пронумерованные (безымянные) обратные ссылки игнорируются. Вместо этого используйте именованные группы.
Я использую следующий vhost:
<VirtualHost *:80>
ServerName 'sub.domain.tld'
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>
Это перенаправляет каждый HTTP-запрос на HTTPS с точным путем
С включенными обратными ссылками только в 2.4.8 (а я использую более раннюю версию) я придумал альтернативное решение, которое не является чистой конфигурацией apache, но работает для меня и может помочь другим.
Я добавил новую конфигурацию vhost, например:
<VirtualHost *:80>
ServerName 000_default_http.commondomain.ext
ServerAdmin technical@commondomain.ext
DirectoryIndex index.html index.php
DocumentRoot /var/www/html/000_default_http/
<Directory /var/www/html/000_default_http/>
AllowOverride All
Require all granted
</Directory>
CustomLog "|/usr/sbin/rotatelogs -l /var/log/httpd/000_default_http%Y%m%d_web.log 86400" combined env=!image
CustomLog "|/usr/sbin/rotatelogs -l /var/log/httpd/000_default_http%Y%m%d_image.log 86400" combined env=image
ErrorLog "|/usr/sbin/rotatelogs -l /var/log/httpd/000_default_http%Y%m%d_error.log 86400"
</VirtualHost>
Здесь ServerName не имеет значения. Поскольку мы даем ему имя файла 000_default_http.conf
, он будет принят как виртуальный хост по умолчанию. Что нам действительно нужно сделать, так это убедиться, что все наши конфигурации vhost указывают:
<VirtualHost *:443>
Затем, когда мы посещаем любой сайт по адресу http: //
, он будет использовать вышеуказанную конфигурацию. Затем я добавил следующее в index.php
в / var / www / html / 000_default_http /
:
<?php
if ($_SERVER['SERVER_PORT'] == '80') {
header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
exit;
}
И убедился, что все каталоги также были обнаружены, добавив .htaccess
также файл:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]
Итак, теперь любой URL-адрес с указанием пути и строки запроса будет перенаправлен с http на https.
Обратите внимание, что если вы решили, что действительно хотите явный HTTP-сайт (или несколько) вместе с HTTPS, это нормально. Просто убедитесь, что ваш 000_default_http.conf
идет первым в алфавитном порядке из конфигураций с виртуальным хостом *: 80
. Если Apache соответствует ServerName
в этих конфигурациях на порту 80, он будет использовать их,в противном случае он будет продолжать использовать указанный выше виртуальный хост и перенаправлять на сервер HTTPS.
Очевидно, вы можете отключить PHP для любого языка по вашему выбору. Но этот метод позволяет мне не беспокоиться о отдельной директиве .htaccess
на всех сайтах и / или путать каждый файл конфигурации vhost для конфигураций разработчика.
Тем не менее, если кто-то может придумать более приятный подход, который может быть реализован исключительно в конфигурации apache, мне было бы очень интересно его услышать.