Немного новичок, когда дело доходит до настройки httpd, но вот моя ситуация:
Я пытаюсь проксировать приложение (назовем его catsapp), которые я не могу контролировать с помощью httpd.
catsapp, приложение html / javascript, также имеет запущенный httpd. Но я не могу связываться с этой конфигурацией, я могу управлять только конфигурацией httpd верхнего уровня.
Оказывается, внутри index.html
из catsapp, есть вызов javascript:
window.location="viewer.html"
Что предназначено для загрузки страницы просмотра.
Обычно написание ProxyPass
директива достаточно проста, и это то, что у меня есть сейчас:
ProxyPass /catsapp http://catsapp-server timeout=600
ProxyPassReverse /catsapp http://catsapp-server timeout=600
Однако это не работает. Если я перейду к example.com/catsapp
Я получаю 200 OK
за которым сразу следует 404 Not Found
потому что браузер пытается загрузить example.com/viewer.html
вместо того example.com/catsapp/viewer.html
.
Есть ли способ настроить корневой сервер httpd так, чтобы при catsapp звонки window.location="viewer.html"
он решает example.com/catsapp/viewer.html
?
Я предполагаю, что есть несколько ресурсов, которые необходимо загрузить из вашего приложения, поэтому example.com/catsapp
надо искать подкаталог. Без косой черты в конце браузеры видят example.com/catsapp
как файловый ресурс, а не как ресурс, подобный папке. По ссылке viewer.html
относительно example.com/catsapp
приводит к example.com/viewer.html
. Однако разрешение viewer.html
относительно example.com/catsapp/
(обратите внимание на косую черту в конце) разрешает example.com/catsapp/viewer.html
.
Я бы предложил перенаправить example.com/catsapp
к example.com/catsapp/
(не внутри, а через HTTP 3xx) и редактирование вашего ProxyPass
правило, чтобы также включить косую черту в конце. Например:
Redirect permanent /catsapp /catsapp/
ProxyPass /catsapp/ http://catsapp-server/ timeout=600
ProxyPassReverse /catsapp/ http://catsapp-server/ timeout=600
После еще нескольких копаний, похоже, то, что я хочу сделать, «нелегко». Теперь я понимаю, что проблема в следующем:
Таким образом, ошибочный URL-адрес определяется на стороне клиента после того, как httpd отсутствует. Кажется, мне нужно было бы использовать что-то вроде mod_substitute
чтобы изменить ответ, отправляемый обратно клиенту на шаге 4, чтобы вставить мой собственный /catsapp
путь до viewer.html
. Звучит некрасиво и подвержено ошибкам.
То, что я решил сделать, кажется немного более надежным, но все же довольно специфичным для этого варианта использования. Я заметил, что index.html
существует только для перенаправления клиента на viewer.html
. Так почему бы мне просто не сделать это автоматически на шаге № 2 выше? Я попробовал это, добавив RewriteRule
к корневому серверу httpd.
RewriteRule (.*/catsapp) https://%{HTTP_HOST}%{REQUEST_URI}/viewer.html [R,L]
И вроде работает нормально. Я не считать есть и другие области приложения, которые пытаются изменить местоположение, например index.html
работает, и это решение не сработает ни в одном случае, когда это произойдет ... так что надеюсь, что это сработает.