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

Прокси-сайт, который использует javascript для изменения расположения window.location?

Немного новичок, когда дело доходит до настройки 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

После еще нескольких копаний, похоже, то, что я хочу сделать, «нелегко». Теперь я понимаю, что проблема в следующем:

  1. Браузер запрашивает example.com/catsapp
  2. Корневой httpd-сервер перехватывает запрос и перенаправляет его на http: // catsapp-server /
  3. catsapp-server httpd принимает запросы и возвращает index.html
  4. Корневой httpd-сервер возвращает ответ клиенту
  5. Браузер получает index.html
  6. Браузер меняет местоположение на example.com/viewer.html (потому что это сказал javascript)

Таким образом, ошибочный 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 работает, и это решение не сработает ни в одном случае, когда это произойдет ... так что надеюсь, что это сработает.