У меня есть сайт 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
Заранее спасибо!
Вы можете удалить запись из файлов .htaccess, файл никогда не читается для запросов с /app
как они проксируются.
У вас неправильная конфигурация:
ProxyPass /app http://localhost:5000
ProxyPassReverse /app http://localhost:5000/app/
Эти записи должны быть идентичны, обе должны быть либо localhost:5000/app/
или localhost:5000
, в зависимости от конфигурации вашего приложения. Они также должны иметь косую черту в конце для обоих параметров или не иметь обоих. В результате смешивания получаются URL-адреса, в которых либо отсутствует косая черта, либо двойная косая черта.
Настройте свое приложение на создание правильных URL-адресов. Обычно для этого есть настройка, часто называемая «BaseURL» или что-то подобное. Для этого обратитесь к документации вашего приложения. Если по какой-то причине ваше приложение не поддерживает это, вы можете настроить Apache для перезаписи URL-адресов на лету, используя директива mod_proxy_html ProxyHTMLURLMap
. Однако это крайнее решение, так как оно требует, чтобы Apache переписывал каждый ответ перед его обслуживанием, что добавляет ненужной дополнительной нагрузки на сервер.