#apache #.htaccess #proxypass
#apache #.htaccess #proxypass
Вопрос:
У меня нет большого опыта работы с серверами. Итак, это может быть глупый вопрос.В настоящее время в файле vim /etc/apache2/sites-enabled/000-default.conf на моем сервере Apache у меня есть прокси-сервер, как показано ниже.
ProxyPass /phpmyadmin !
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
Я хочу реализовать условный прокси-проход для приведенного ниже сценария
если URL-адрес содержит ?_escaped_fragment_=
, например, URL-адрес ниже
http://localhost/web/?_escaped_fragment_=/health
Я хочу, чтобы этот URL-адрес был перенаправлен на URL-адрес с другим портом, например, URL-адрес ниже,
http://localhost:8082/web/?_escaped_fragment_=/health
если URL-адрес не содержит ?_escaped_fragment_=
, например, URL-адрес ниже,
http://localhost/web/#!/health
Должен произойти прокси-сервер, о котором я упоминал ранее, который перенаправляет на порт 8080. Какой код для этого?
Комментарии:
1. Какая версия apache?
2. Поиск условного прокси-сервера apache дает, среди прочего serverfault.com/questions/625426 /… , может быть, это поможет.
3. Привет, моя версия apache — Apache / 2.4.7
Ответ №1:
Поскольку ProxyPass не может войти внутрь оператора If, вам нужно будет использовать mod_rewrite для прокси / перенаправления и использовать RewriteCond для фильтрации строки запроса.
Поскольку строка запроса не изменяется в соответствии с запросом, вот примерный пример:
RewriteEngine on
RewriteCond %{QUERY_STRING} ^_escaped_fragment_ [NC]
RewriteRule ^/(.*) http://localhost:8082/$1 [QSA,P,L]
RewriteRule ^/(.*) http://localhost:8080/$1 [P,L]
ProxyPassReverse / http://localhost:8080/
ProxyPassReverse / http://localhost:8082/
Это означает, что если query_string соответствует строке «_escaped_fragment_WHATEVERHERE», передайте все в пункт назначения на порт 8082 и добавьте любую строку запроса, которую она была добавлена.
В других случаях прокси-сервер будет прокси-сервером для localhost: 8080.
Обратите внимание, что я добавил QSA, который является флагом, который говорит добавить любую строку запроса в исходном запросе, но я добавил его для ясности, поскольку mod_rewrite в любом случае сделает это по умолчанию в этом случае. Больше информации об этом в ссылке rewrite flags, которую я добавляю ниже.
Вы можете сделать этот пример намного более конкретным, например, последняя перезапись будет принимать любую другую строку запроса, если вы не хотите, чтобы вы могли отфильтровать ее с помощью более подробной перезаписи секундой ранее или с другой перезаписью секунд.
Для получения более подробной информации вот что говорится об этом в официальных документах: Перезаписать флаги
mod_rewrite
Комментарии:
1. Я использовал это правило перезаписи. Но я не могу это реализовать, потому что тогда URL-адрес в браузере также автоматически изменится на localhost, который не работает с моей реализацией. Я хочу, чтобы URL-адрес в браузере был таким же. Не могу ли я использовать IfDefine для проверки условия и определения номера порта. Я пытался это сделать, и это не сработало. И когда я попытался определить переменную внутри if, она выдает ошибку.
2. Если вы добавите пример, когда страница возвращается как localhost или аналогичный, тогда я смогу помочь. Эти перезаписи вообще не влияют на имя хоста в URL-адресе, и проблема, которую вы описываете, не имеет к ним никакого отношения, вероятно, вам просто не хватает записи ProxyPassReverse, например, add:
ProxyPassReverse / http://localhost:8080/
andProxyPassReverse / http://localhost:8082/
. Позвольте мне исправить ответ, чтобы добавить их.3. @ezra-s, я хочу сделать что-то вроде
RewriteRule ^/(.*) http://localhost:8080/$1 [P,L] ProxyPassReverse /$1 http://localhost:8080/
того, что я хочу добавить соответствующий текст вRewriteRule
ProxyPassReverse
. Как я могу это сделать?4. «ProxyPassReverse / localhost: 8080 » соответствует каждому возможному URL-пути, отправленному серверной частью в перенаправлении, поэтому вам не нужно ничего подобного, что вы описываете.