Вопрос или проблема
У меня есть этот custom.conf для контейнера Apache Docker
ServerName https://staging.smartreparatur.at
# Включить сжатие Gzip (Deflate)
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
DeflateCompressionLevel 9
</IfModule>
<Directory /var/www/html>
DirectoryIndex index.php
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Включить кэширование статических ресурсов
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
</IfModule>
# Заголовки безопасности
<IfModule mod_headers.c>
Header set X-Content-Type-Options "nosniff"
# Header set X-Frame-Options "SAMEORIGIN"
Header set X-XSS-Protection "1; mode=block"
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
</IfModule>
# Включить логирование
# Логировать в стандартный вывод (stdout)
CustomLog /proc/self/fd/1 common
ErrorLog /proc/self/fd/2
это для контейнера Apache Docker за обратным прокси.
Сайт работает только при установке ServerName с протоколом https://, хотя это не требуется / не разрешено согласно документации Apache.
При удалении, попытка открыть сайт приводит к циклу перенаправления.
Вот мой полный вопрос с дополнительными деталями, его нельзя разместить здесь напрямую
GIST полный вопрос для StackExchange
основано на этой рекомендации
Я решил это, добавив
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule ^ - [E=HTTPS:on]
</IfModule>
в custom.conf, чтобы приложение могло использовать эту информацию для дальнейшей обработки
Ответ или решение
Подробное руководство: Использование ServerName с протоколом в Apache
В данном руководстве мы разберем, как правильно настроить директиву ServerName
в конфигурационном файле Apache для сценария использования контейнера с Docker, который находится за обратным прокси. Особое внимание будет уделено проблемам, возникающим из-за неопределенности протокола, а также решение, примененное вами для их устранения.
Конфигурация Apache в Docker
Ваша конфигурация, представленная в файле custom.conf
, имеет следующие ключевые компоненты:
-
ServerName:
ServerName https://staging.smartreparatur.at
Здесь вы указали имя сервера с полным URL, включая протокол HTTPS. Это не является стандартной практикой, так как
ServerName
должен содержать только доменное имя (например,staging.smartreparatur.at
), без протокола. -
Модули сжатия и кэширования:
Ваша конфигурация включает использование модулейmod_deflate
иmod_expires
, которые обеспечивают эффективное сжатие и кэширование ресурсов, что увеличивает производительность вашего сайта. -
Безопасностные заголовки:
Вы добавили ряд заголовков безопасности, какStrict-Transport-Security
, которые являются важными для защиты вашего сайта от атак. -
Логирование:
Запись журналов ошибок и доступа в стандартный вывод контейнера, что является хорошей практикой при работе с Docker.
Проблемы с перенаправлением
Вы столкнулись с проблемой "петли перенаправления" при удалении протокола из ServerName
. Это связано с тем, что Apache не знает, работает ли он над HTTPS или HTTP, что может привести к неправильной интерпретации запросов. При использовании обратного прокси сервер, который может устанавливать либо HTTPS, либо HTTP, важно учитывать наличие флагов, таких как X-Forwarded-Proto
, которые сообщают Apache о протоколе, используемом для обращения к вашему контейнеру.
Решение проблемы с помощью модификации конфигурации
Ваше решение добавить блок переписывания в custom.conf
:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule ^ - [E=HTTPS:on]
</IfModule>
Этот код активирует переписывание на основе заголовка X-Forwarded-Proto
, который устанавливается обратным прокси-сервером (например, Nginx или HAProxy), и указывает Apache, что текущий запрос пришел по HTTPS.
Рекомендации по улучшению конфигурации
-
Правильный
ServerName
: ИзменитеServerName
на только доменное имя, как указано ниже:ServerName staging.smartreparatur.at
-
Проверьте конфигурацию обратного прокси: Убедитесь, что ваш обратный прокси корректно передает заголовок
X-Forwarded-Proto
. Это позволит Apache корректно обрабатывать запросы. -
Обновление конфигурации безопасности: Убедитесь, что ваши заголовки безопасности соответствуют современным стандартам и требованиям безопасности.
-
Мониторинг производительности: Используйте логи и мониторинг для анализа производительности и возможных ошибок, чтобы вовремя реагировать на проблемы.
Заключение
Использование ServerName
с указанием протокола в конфигурации Apache может привести к путанице и ошибкам, особенно в сценариях с обратными прокси. Правильный подход заключается в использовании базового имени хоста и настройке необходимых заголовков для обработки запросов. Настройка mod_rewrite
для определения протокола является отличным решением для успешной работы вашего приложения в контейнере Apache.