Apache ProxyPass ignore static files

16,545

Solution 1

You need to use the ProxyPass ! argument with a path, not in a <Location> block, for example:

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

I believe these rules are processed in the order they appear in the config, so be sure to specify exclude rules first.

Solution 2

The way to make it work inside Location blocks is to reverse the order, i.e. have the most specific Location statement last:

DocumentRoot /path/to/foo
  ServerName foo.com
  ServerAdmin [email protected]

  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>

This works. See https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass for more details - it contains an example pretty much exactly as the above.

Share:
16,545

Related videos on Youtube

Karnan Kurup
Author by

Karnan Kurup

Updated on September 18, 2022

Comments

  • Karnan Kurup
    Karnan Kurup almost 2 years

    Having an issue with Apache front server connecting to a Jetty application server.

    I thought that ProxyPass ! in a location block was supposed to NOT pass on processing to the application server, but for some reason that is not happening in my case, Jetty shows a 404 on the missing statics (js, css, etc.)

    Here's my Apache (v 2.4, BTW) virtual host block:

    DocumentRoot /path/to/foo
      ServerName foo.com
      ServerAdmin [email protected]
    
      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>
    
  • Karnan Kurup
    Karnan Kurup about 12 years
    I need to check this, but Apache 2.4 docs indicate that <Location />ProxyPass</Location> is the preferred/performant approach to proxying. I tried, BTW, ProxyPass /static ! outside of Location block and same deal, Jetty tries to serve it
  • Karnan Kurup
    Karnan Kurup about 12 years
    ok, in 2.4 docs they state that multiple proxy directives outside a location block can be a performance bottleneck; however, given that I'll have a handful at most, a non-issue. Location blocks would work, BTW, if I had a more specific directive than <Location /> for the catch all. Appears that after <Location /static/> is processed, it moves on to <Location /> and proxies the /static/foo/bar.css file to Jetty, ignoring the first directive...
  • fideloper
    fideloper almost 10 years
    So is this possible in Apache 2.4.10 using Location blocks?