Назад | Перейти на главную страницу

Изменить URL-адрес ответа или заголовок местоположения Apache2 mod_proxy

У меня есть сайт WordPress, работающий на сервере, где теперь мне нужно развернуть веб-приложение, и, поскольку наш сертификат SSL не является подстановочным знаком, он также должен находиться под тем же доменным именем. Теперь он работает на другом порту, но пользователи жалуются, что доступ не так удобен.

Я установил обратный прокси-сервер, потому что приложение запускается другой службой на том же компьютере, но когда запрос возвращается пользователю, он теряет первую часть URL-адреса, поэтому он заканчивается ошибкой 404.

Сайт WordPress работает на www.example.com и веб-приложение должно быть включено www.example.com/app но когда запрос возвращается, URL-адрес выглядит как www.example.com/Identity... вместо того www.example.com/app/Identity...

Это конфигурация виртуального хоста и htaccess, который я использую в WordPress, чтобы разрешить / app проходить через маршрутизацию WordPress. Я пробовал использовать ProxyPassReverse, но он не работает, и использование mod_rewrite не вариант, потому что URL-адреса из веб-приложения не всегда начинаются с одной и той же строки.

VirtualHost:

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost

                ServerName www.example.com

                DocumentRoot /var/www/html

                        ProxyPreserveHost On
                        ProxyRequests Off
                        ProxyPass /app http://localhost:5000
                        ProxyPassReverse /app http://localhost:5000/app/

                Header unset X-Frame-Options

                LogLevel trace3

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile /etc/apache2/ssl/cert.pem
                SSLCertificateKeyFile /etc/apache2/ssl/private.key
                SSLCertificateChainFile /etc/apache2/ssl/intermediate.pem

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

Htaccess:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} ^/app.*$ [NC]
RewriteRule . - [L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Заранее спасибо!

  1. Вы можете удалить запись из файлов .htaccess, файл никогда не читается для запросов с /app как они проксируются.

  2. У вас неправильная конфигурация:

    ProxyPass /app http://localhost:5000
    ProxyPassReverse /app http://localhost:5000/app/
    

    Эти записи должны быть идентичны, обе должны быть либо localhost:5000/app/ или localhost:5000, в зависимости от конфигурации вашего приложения. Они также должны иметь косую черту в конце для обоих параметров или не иметь обоих. В результате смешивания получаются URL-адреса, в которых либо отсутствует косая черта, либо двойная косая черта.

  3. Настройте свое приложение на создание правильных URL-адресов. Обычно для этого есть настройка, часто называемая «BaseURL» или что-то подобное. Для этого обратитесь к документации вашего приложения. Если по какой-то причине ваше приложение не поддерживает это, вы можете настроить Apache для перезаписи URL-адресов на лету, используя директива mod_proxy_html ProxyHTMLURLMap. Однако это крайнее решение, так как оно требует, чтобы Apache переписывал каждый ответ перед его обслуживанием, что добавляет ненужной дополнительной нагрузки на сервер.