Передача условного прокси-сервера Apache

#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/ and ProxyPassReverse / 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-пути, отправленному серверной частью в перенаправлении, поэтому вам не нужно ничего подобного, что вы описываете.