URL-адрес Apache перезаписывается перед прокси

У меня есть apache, настроенный как прокси для моего приложения, которое должно работать на определенном порту, это отлично работает с виртуальным хостом. Теперь мне нужно добавить еще одну директиву, мне нужно удалить /ex/ из любого входящего запроса и передать переписанный URL-адрес прокси.

Кажется, я не могу заставить оба работать, либо apache может переписать URL-адрес, но затем не может проксировать и пытается обслужить сам запрос, или он правильно проксирует, не удаляя /ex/, и маршрутизация моего приложения не выполняется, потому что он ищет /бывший/.

Вот рабочая конфигурация прокси (без перезаписи). Как я могу удалить /ex/ перед передачей его прокси? По-видимому, apache не может [P, R] одновременно, PT просто пересылает как есть.

<VirtualHost *:82>
  ServerName xxx
  ServerAlias xxx

  DocumentRoot /opt/xxx

  RewriteEngine On

  # neither of these works, simply proxies as is to my application, routing fails
  # RewriteRule ^ex/(.*) /$1 [L,R]
  # RewriteRule ^/ex$ / [L,PT]

  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
  RewriteRule ^/(.*)$ http://127.0.0.1:11110%{REQUEST_URI} [P,QSA,L]

  ProxyPass / http://127.0.0.1:11110/
  ProxyPassReverse / http://127.0.0.1:11110/
  ProxyPreserveHost on

  # this doesn't work either
  # ProxyPass /ex http://127.0.0.1:11110/

</VirtualHost>

person blackbird    schedule 08.12.2014    source источник


Ответы (2)


Вы можете просто использовать ProxyPassMatch вместо ProxyPass:

ProxyPassMatch ^/ex/(.*) http://127.0.0.1:11110/$1
person covener    schedule 09.12.2014

Просто, эта линия

ProxyPass /ex http://127.0.0.1:11110/

должен прийти раньше

ProxyPass / http://127.0.0.1:11110/

поскольку / будет соответствовать всему, это больше ведро, чем / ex, поэтому ProxyPass / всегда должен быть последним в файле конфигурации. Это означает, что если не найдено совпадения /шаблон, то / будет обрабатывать весь шаблон в конце.

person punitusingh    schedule 01.03.2015