Question

I have Apache 2.2.15 configured with Mod_Proxy and Mod_SSL and serving CherryPy web application on RHEL 6.3. The only thing I'm struggling with is getting Apache to serve the website's static content (*.js, *.css, *.jpg). Here is my VirtualHost entry...

<VirtualHost mydomain.com:443>
ServerAdmin support@mydomain.com
ServerName mydomain.com
ProxyPreserveHost On
SSLProxyEngine On
DocumentRoot /var/www/html/mydomain

SSLEngine on
SSLCertificateKeyFile /etc/ssl/myserver.key
SSLCertificateFile /etc/ssl/mydomain_com.crt
SSLCertificateChainFile /etc/ssl/mydomain_com.ca-bundle

# this prevents the follow URL path from being proxied
ProxyPass static/ !

# setup the proxy
<Proxy *>
    Order allow,deny
    Allow from all
</Proxy>
ProxyPass / http://www.mydomain.com:8080/
ProxyPassReverse / http://www.mydomain.com:8080/
</VirtualHost>

For instance the path to my css file is the following...

/var/www/html/mydomain/static/style.css

Since I'm forcing the entire site to be in https when I navigate to

https://www.mydomain.com/static/style.css

or

http://www.mydomain.com/static/style.css

My browser tells me the page is not found (404). Can anyone see what I'm doing wrong?

EDIT: it appears that Apache is still proxying /static... I found this redirect when accessing the /static/style.css in my Apache access log...

xxx.xxx.xxx.xxx - - [17/Sep/2012:08:46:06 -0400] "GET /static/style.css HTTP/1.1" 301 337 "https://www.mydmain.com/Home/" "Mozilla/5.0 (X11; Linux x86_64; rv:10.0.7) Gecko/20120826 Firefox/10.0.7"

anyone know why that is happening?

Thanks in advance!

Andrew

Was it helpful?

Solution

Try adding an alias for your static folder before ProxyPass. It worked like champ for me,

Alias /static/ /var/www/html/mydomain/static/

OTHER TIPS

If the static files are under the "main" source folder, I'd suggest telling CherryPy to serve the specific folder(s) for stylesheets, images, js etc

Personally I generate the config and then use that config when mounting the application like:

app = cherrypy.tree.mount(Root(), script_name="", config=somefile.get_config())

An example of static file serving with CherryPy.

  • The /css is the path that you use from within your templates or HTML.
  • The os.path.abspath(os.path.join(os.path.dirname(__file__) generates a path pointing to your index file (or some other script if your not starting quickstart() from within the index)
  • The above path is then followed by the relative path to your static content folder

File:

##somefile
def get_config():
    return {
        '/':
        {
            'tools.encode.on': True,
            'tools.encode.encoding': 'UTF-8'
        },
        '/css':
        {
            'tools.staticdir.on': True,
            'tools.staticdir.dir': os.path.abspath(os.path.join(os.path.dirname(__file__), 'relative/path/to/your/css/folder'))
        },
        '/js':
        {
            'tools.staticdir.on': True,
            'tools.staticdir.dir': os.path.abspath(os.path.join(os.path.dirname(__file__), 'relative/path/to/your/js/folder'))
        }
    }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top