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

Apache ProxyPass игнорирует статические файлы

Возникла проблема с подключением переднего сервера Apache к серверу приложений Jetty.

я думал что ProxyPass ! в блоке местоположения предполагалось НЕ передавать обработку серверу приложений, но по какой-то причине в моем случае этого не происходит, Jetty показывает 404 на отсутствующей статике (js, css и т. д.)

Вот мой блок виртуального хоста Apache (v 2.4, BTW):

DocumentRoot /path/to/foo
  ServerName foo.com
  ServerAdmin webmaster@foo.com

  RewriteEngine On

  <Directory /path/to/foo>
    AllowOverride  None
    Require all granted
  </Directory>

  ProxyRequests Off
  ProxyVia Off
  ProxyPreserveHost On

  <Proxy *>
    AddDefaultCharset off
    Order deny,allow
    Allow from all
  </Proxy>

  # don't pass through requests for statics (image,js,css, etc.)
  <Location /static/>
    ProxyPass !
  </Location>

  <Location />
    ProxyPass           http://localhost:8081/
    ProxyPassReverse    http://localhost:8081/
    SetEnv              proxy-sendchunks 1
  </Location>

Вам необходимо использовать ProxyPass! аргумент с путем, а не в <Location> блок, например:

ProxyPass /static !
ProxyPass / http://localhost:8081/
ProxyPassReverse / http://localhost:8081/

Я считаю, что эти правила обрабатываются в том порядке, в котором они появляются в конфигурации, поэтому сначала обязательно укажите правила исключения.

Как заставить его работать внутри Location блоки должны быть в обратном порядке, т.е. иметь наиболее конкретные Location заявление последний:

DocumentRoot /path/to/foo
  ServerName foo.com
  ServerAdmin webmaster@foo.com

  RewriteEngine On

  <Directory /path/to/foo>
    AllowOverride  None
    Require all granted
  </Directory>

  ProxyRequests Off
  ProxyVia Off
  ProxyPreserveHost On

  <Proxy *>
    AddDefaultCharset off
    Order deny,allow
    Allow from all
  </Proxy>

  <Location />
    ProxyPass           http://localhost:8081/
    ProxyPassReverse    http://localhost:8081/
    SetEnv              proxy-sendchunks 1
  </Location>

  # don't pass through requests for statics (image,js,css, etc.)
  <Location /static/>
    ProxyPass !
  </Location>

Это работает. Видеть https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass для более подробной информации - он содержит пример почти такой же, как указано выше.