- Вопрос или проблема
- Пробовал
- Также пробовал
- Проверки
- Документация Apache
- Аналогичные вопросы
- Ответ или решение
- Обзор проблемы
- Решение проблемы
- 1. Проверка конфигурации модуля
- 2. Конфигурация mod_proxy_html
- 3. Проверка на наличие ошибок
- 4. Перезагрузка сервера
- 5. Тестирование
- 6. Использование mod_substitute как альтернативы
- Заключение
Вопрос или проблема
У меня есть этот код (который работает) в Plesk в Клиенты > Имя клиента > new-domain.com > Хостинг & DNS > Параметры Apache & nginx > Дополнительные директивы Apache (для обоих HTTP + HTTPS):
ProxyRequests On
SSLProxyEngine On
ProxyPass / https://old-domain.com/
ProxyPassReverse / old-domain.com/
Это означает, что к сайту можно получить доступ через new-domain.com
, и он будет отображать контент с old-domain.com
, при этом в адресной строке браузера будет отображаться new-domain.com
.
Все относительные URL в HTML сайта работают отлично, однако в HTML также есть тысячи абсолютных URL – и при нажатии на любой из них URL в адресной строке меняется на old-domain.com
.
Я хотел бы использовать mod_substitute
, чтобы произвести замену в HTML. Я попробовал добавить это на новой строке под кодом выше:
Substitute "s/old-domain.com/new-domain.com/ni"
Но, похоже, это не дает результатов – HTML не меняется.
Как мне заменить домен в абсолютных URL, когда я использую прокси, в Plesk?
Пробовал
-
Удалить
"
с обеих сторон строки -
Изменить разделитель с
/
на|
-
Добавить это над строкой
Substitute
:AddOutputFilterByType SUBSTITUTE text/html
-
Изменить строку
AddOutputFilterByType
на:AddOutputFilterByType INFLATE;SUBSTITUTE;DEFLATE text/html
-
Переместить строки
Substitute
+AddOutputFilterByType
в файл.htaccess
в верхний каталог для этого домена – где бы находилсяindex.html
(оставив строки прокси в Директивах)
Также пробовал
-
В SSH:
yum install -y mod_proxy_html
-
Под строками
Proxy
, не использовать никакие строки замены, а вместо этого использовать:SetOutputFilter proxy-html ProxyHTMLURLMap https://old-domain.com /
-
Переместить эти строки в
.htaccess
(оставив строки прокси в Директивах) -
Использовать эти строки:
ProxyRequests off ProxyHTMLURLMap https://old-domain.com / RequestHeader unset Accept-Encoding
-
Изменить строку
SetOutputFilter
на:AddOutputFilterByType proxy-html text/html
-
Изменить строку
SetOutputFilter
на:SetOutputFilter INFLATE;proxy-html;DEFLATE
Проверки
Я проверил в Инструменты & Настройки > Настройки веб-сервера Apache, что следующие модули Apache включены: proxy_html
, proxy_http
, substitute
.
Я подтвердил с помощью httpd -M | grep substitute
и httpd -M | grep proxy_html
, что модули включены.
Прокси работает отлично, но, что бы я ни пробовал, я не могу заставить замену или карты URL работать.
Я не вижу никаких записей в журнале, относящихся к какому-либо модулю.
Я использую последнюю версию Plesk (Plesk Obsidian Web Pro Edition, Версия 18.0.64 Обновление #1).
Я использую Apache httpd 2.4.37-65.module_el8.10.0+3874+c2064c23.2
.
Документация Apache
-
Из
mod_substitute
:Распространенный сценарий использования
mod_substitute
– это ситуация, в которой фронтенд-сервер проксирует запросы к бэкенд-серверу, который возвращает HTML с жестко закодированными встраиваемыми URL, ссылающимися на бэкенд-сервер. -
Из
mod_proxy
:Apache httpd не будет переписывать URL-ссылки внутри HTML-страниц. Это означает, что если проксируемый контент содержит абсолютные ссылки на URL, они обойдут прокси. Чтобы переписать HTML-контент, чтобы он соответствовал прокси, вам нужно загрузить и активировать
mod_proxy_html
. -
Из Сопоставление URL с файловыми системами:
Ссылки внутри документов не будут переписаны. Поэтому любые абсолютные ссылки на internal.example.com приведут к тому, что клиент выйдет из прокси-сервера и сделает запрос напрямую к internal.example.com. Вы можете изменить эти ссылки (и другой контент) на странице по мере его обслуживания клиенту с помощью
mod_substitute
. Для более сложного переписывания ссылок в HTML и XHTML также доступен модульmod_proxy_html
. Он позволяет создавать карты URL, которые нужно переписывать, чтобы можно было обрабатывать сложные сценарии проксирования.
Аналогичные вопросы
Ответ или решение
Ситуация, которую вы описали, касается конфигурации Apache для проксирования запросов с использованием модулей mod_proxy
, mod_substitute
и mod_proxy_html
в Plesk. Основной проблемой, с которой вы столкнулись, являются абсолютные URL адреса, которые продолжают вести на old-domain.com
, несмотря на все предпринятые шаги по замене URL.
Обзор проблемы
Ваше текущее решение успешно проксирует запросы от new-domain.com
на old-domain.com
, что позволяет отображать контент старого домена, сохраняя при этом новый адрес в адресной строке. Однако, проблема заключается в том, что все абсолютные URL, находящиеся в HTML-контенте, остаются неизменными, что приводит к сбою при навигации по сайту. Для решения этой проблемы вы правильно решили использовать mod_substitute
и mod_proxy_html
для редактирования HTML-контента на лету.
Решение проблемы
1. Проверка конфигурации модуля
Убедитесь, что оба модуля (mod_substitute
и mod_proxy_html
) правильно загружены и активированы. Вы подтвердили это через команды httpd -M
, что уже прекрасно.
2. Конфигурация mod_proxy_html
mod_proxy_html
может быть более подходящим для вашей задачи, поскольку он специально предназначен для замены URL в HTML-контенте, возвращаемом службой, к которой идет проксирование. Для его использования вам нужно будет убедиться, что вы используете правильные команды для перенастройки URL.
Пример конфигурации может выглядеть следующим образом:
ProxyRequests On
SSLProxyEngine On
ProxyPass / https://old-domain.com/
ProxyPassReverse / old-domain.com/
SetOutputFilter proxy-html
ProxyHTMLURLMap https://old-domain.com/ /
RequestHeader unset Accept-Encoding
3. Проверка на наличие ошибок
Убедитесь, что нет ошибок конфигурации, которые могли бы помешать загрузке модулей. Проверьте журналы ошибок Apache (error_log
) на наличие записей, указывающих на проблемы с модулями или конфигурацией.
4. Перезагрузка сервера
После внесения любых изменений в конфигурацию Apache убедитесь, что вы перезапустили сервер:
sudo systemctl restart httpd
5. Тестирование
После перезапуска протестируйте на своем сайте, щелкнув по абсолютным ссылкам в основном контенте. Это должно обеспечить правильную работу замены.
6. Использование mod_substitute
как альтернативы
Если вы всё-таки хотите попробовать mod_substitute
, убедитесь, что ваш синтаксис корректен. Попробуйте следующие строки:
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|https://old-domain.com|https://new-domain.com|ni"
Также замените символы-разделители, чтобы избежать конфликтов, как показано выше (используйте символ |
вместо /
).
Заключение
Таким образом, используя комбинацию mod_proxy_html
и корректных замен с Substitute
, вы сможете производить необходимую замену-url в HTML-контенте сайта. Надеюсь, эти рекомендации помогут вам достичь желаемого результата. Если проблема остается, рассмотрите возможность обращения в службу поддержки Plesk или изучения дополнительных логов, чтобы выявить возможные узкие места.