Apache mod_substitute и mod_proxy_html ничего не делают, используем mod_proxy в Plesk

Вопрос или проблема

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

Оцените материал
Добавить комментарий

Капча загружается...