Можно ли сделать перенаправление HTTP-> HTTPS с подстановочными знаками для всех vhosts?

На нашем сервере разработки у нас есть несколько сайтов для нескольких разработчиков, работающих через 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. Во избежание путаницы пронумерованные (безымянные) обратные ссылки игнорируются. Вместо этого используйте именованные группы.

0
задан 4 March 2019 в 14:37
2 ответа

Я использую следующий vhost:

<VirtualHost *:80>

    ServerName 'sub.domain.tld'

    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]

</VirtualHost>

Это перенаправляет каждый HTTP-запрос на HTTPS с точным путем

1
ответ дан 4 December 2019 в 13:21

С включенными обратными ссылками только в 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, мне было бы очень интересно его услышать.

1
ответ дан 4 December 2019 в 13:21

Теги

Похожие вопросы