У меня есть несколько веб-приложений, размещенных на сервере AWS на различных портах, например.
app1: http://x.x.x.x:8080
app2: http://x.x.x.x:9000
...
Я хотел бы к прокси перед этими приложениями (апач, nginix и т.д.) так, чтобы ко всем ним можно было получить доступ с помощью порта 80. Я мог думать о двух подходах:
Поместите каждое приложение на различный субдомен и передайте на основе субдомена, например,
http://app1.mydomain.com --> http://x.x.x.x:8080
http://app2.mydomain.com --> http://x.x.x.x:9000
Однако в моем случае, я не управляю созданием субдоменов. Мне дали на субдомене, и я должен жить с этим. Таким образом, этот подход не работает.
Используйте отдельный URL для каждого приложения и затем перепишите URL, например.
http://mysubdomain.mydomain.com/app1 --> http://x.x.x.x:8080
http://mysubdomain.mydomain.com/app2 --> http://x.x.x.x:9000
Однако я сталкиваюсь с проблемой с этим подходом. Например, http://mysubdomain.mydomain.com/app1
правильно возвраты index.html от app1, но затем который index.html просит js и файлы CSS без app1 префикса, например, он просит http://mysubdomain.mydomain.com/js/main.js
вместо http://mysubdomain.mydomain.com/app1/js/main.js
. Как Вы видите, передающее правило больше не работает. Еще более сбивающий с толку это, если мой начальный запрос завершается с наклонной чертой (http://mysubdomain.mydomain.com/app1/
), затем запросы на js и файлы CSS отформатированы правильно (http://mysubdomain.mydomain.com/app1/js/main.js
). Я не понимаю это поведение!
Есть ли какой-либо другой подход, о котором можно думать? Я услышал об отображении заголовка хоста, но не мог выяснить, как оно работает. Я не могу предположить, что эта проблема не была решена!
Редактирования на основе предложения от @stoned
Мне вручили веб-приложение из http://x.x.x.x:8080. Этот URL служит файлу index.html, который вытягивает в наборе файлов JavaScript и CSS.
Вот моя попытка инвертировать прокси это приложение с помощью Apache, работающего в http://www.example.com
:
# Reverse proxy requests for /app1 to http://x.x.x.x:8080
ProxyRequests off
ProxyPass /app1 http://x.x.x.x:8080
ProxyPassReverse /app1 http://x.x.x.x:8080
Это не работает, когда я ввожу http://www.example.com/app1
в моем браузере (не отмечают наклонной черты в конце).
index.html
подается правильноОднако index.html
просит CSS и js со строками как это:
<link rel="stylesheet" href="vendor/bootstrap.min.css"/>
<script src="vendor/angular.min.js"></script>
Это переводит в запросы как это без app1
встроенный в URL:
http://www.example.com/vendor/bootstrap.min.css
http://www.example.com/vendor/angular.min.js
Очевидно, обратный прокси не знает, что сделать с ними!
Однако, если я добавляю наклонную черту в конце URL (http://www.example.com/app1/
), затем запросы переводятся правильно:
http://www.example.com/app1/vendor/bootstrap.min.css
http://www.example.com/app1/vendor/angular.min.js
Я не понимаю, как добавление наклонной черты в конце заставляет браузер вести себя по-другому! Так или иначе важный момент - то, что я не могу ожидать, что мои пользователи введут наклонную черту в конце. Какие-либо мысли о том, как решить эту проблему?
Решенный - наконец!
После набора поиска с помощью Google я нашел, что запаздывающая наклонная черта используется, чтобы указать, что требуемый ресурс является каталогом. В таких случаях ресурс "по умолчанию" из каталога возвращается (обычно index.html). Если пользователь неправильно запрашивает каталог без запаздывающей наклонной черты, mod_dir (который обычно загружается в установках Apache), добавляет запаздывающая наклонная черта и делает клиентское перенаправление, решая проблему.
В моем случае, http://www.example.com/app1
не перенаправлял к http://www.example.com/app1/
(с запаздывающей наклонной чертой), потому что /app1
не реальный каталог на апачском сервере - mod_dir, не обнаруживал это. Следовательно этот URL проксировался на http://x.x.x.x:8080, как. В то время как это правильно возвращало index.html, но последующие запросы были относительно http://www.example.com
и нет http://www.example.com/app1
. Для решения проблемы я добавил переписать правило перенаправить http://www.example.com/app1
кому: http://www.example.com/app1/
(с наклонной чертой). Я также изменил свои обратные правила прокси только соответствовать, если я нахожу запаздывающую наклонную черту. Посмотрите ниже:
# Fix any request for /app1 to /app1/
RewriteEngine on
RewriteRule ^/app1$ /app1/ [R]
# Reverse proxy requests for /app1/ to http://x.x.x.x:8080/
ProxyRequests off
ProxyPass /app1/ http://x.x.x.x:8080/
ProxyPassReverse /app1/ http://x.x.x.x:8080/
С Apache это можно сделать с помощью обратного прокси. В вашем случае с Apache вы можете использовать такой подход в конфигурационном файле:
ProxyRequests off
ProxyPass /app1 http://x.x.x.x:8080
ProxyPassReverse /app1 http://x.x.x.x:8080
ProxyPass /app2 http://x.x.x.x:9000
ProxyPassReverse /app2 http://x.x.x.x:9000
(Конечно, в вашем Apache должна быть включена и загружена функция mod_proxy_http) Если ваше приложение использует файлы cookie, возможно, вам также потребуется правильно установить директивы ProxyPassReverseCookieDomain и ProxyPassReverseCookiePath. Вы можете прочитать соответствующую документацию здесь .
Также вы забыли упомянуть, какой сервер приложений вы используете, даже если я вижу, что вы используете какой-то сервер приложений java. Имейте в виду, что часто серверам приложений совсем не понравится, если вы измените контекст приложения, который вы должны держать даже на прокси-сервере, чтобы быть в безопасности.
Наконец, что касается переписывания вашего url, извините, но если вы не опубликуете вашу точную конфигурацию, я думаю, что никто не сможет вам помочь. Имейте в виду, что в любом случае косые черты действительно имеют значение для серверов web/приложений. Некоторые добавляют их автоматически, другие нет.