Search code examples
djangowordpressmod-wsgiapache-config

Django (wsgi) and Wordpress coexisting in Apache virtualhost


I have a Django project that I need mounted at two different subdirectories of my url, and I need Wordpress running at /. So:

*.example.com - WordPress
*.example.com/studio - django
*.example.com/accounts - django

Here's the httpd.conf that I have so far:

<VirtualHost *:80>
    ServerName wildcard.localhost
    ServerAlias *.localhost

    AddType application/x-httpd-php .php
    DocumentRoot /var/empty

    Alias /site_media/ /home/zach/projects/python/myproject/static/
    Alias /media/ /home/zach/projects/python/myproject/env/lib/python2.6/site-packages/django/contrib/admin/media/
    Alias / /home/zach/projects/python/myproject/wordpress/

    WSGIScriptAlias /accounts /home/zach/projects/python/myproject/app/privio.wsgi
    WSGIScriptAlias /studio /home/zach/projects/python/myproject/app/privio.wsgi

    <Directory /home/zach/projects/python/myproject/app>
    Order allow,deny
    Allow from all
    </Directory>

    <Directory /home/zach/projects/python/myproject/wordpress>
    Order allow,deny
    Allow from all
    </Directory>

Before I added the config for WordPress, the Django app was working fine. But with this new setup I am able to see the WordPress install at /, but the Django app isn't getting served. I'm sort of a noob at Apache config - what am I missing?


Solution

  • Replace:

    DocumentRoot /var/empty
    

    with:

    DocumentRoot /home/zach/projects/python/myproject/wordpress
    

    Remove:

    Alias / /home/zach/projects/python/myproject/wordpress/
    

    Replace:

    WSGIScriptAlias /accounts /home/zach/projects/python/myproject/app/privio.wsgi
    WSGIScriptAlias /studio /home/zach/projects/python/myproject/app/privio.wsgi
    

    with:

    WSGIScriptAliasMatch ^(/(accounts|studio)) /home/zach/projects/python/myproject/app/privio.wsgi$1
    

    In other words, use DocumentRoot to refer to wordpress that needs to be at root of site and not Alias directive.

    The WSGIScriptAliasMatch is so Django itself thinks it is still mounted at root site even though only nominated sub URLs of it are actually passed through. This simplifies things for urls.py.

    Note that the $1 at end of WSGI script path is important, so don't leave it off.