I've got Apache serving multiple django web apps via virtual hosts.
For one of those hosts, I have "WSGIPassAuthorization On".  However,
the django app does not have HTTP_AUTHORIZATION or
HTTP_HTTP_AUTHORIZATION in the request.META headers.  If I run the app
with the django "manage.py runserver", then I see the header just
fine.

I'm using Apache 2.2 with mod_wsgi 3.1.  I use hostname-based virtual
hosts.  I used to have this working on another server by simply using
"WSGIPassAuthorization On" in the httpd.conf file, but I've changed
setup and now I can't figure out why it's not working.

Here is my httpd.conf:
        ServerRoot "/path/to/apache2"
        Listen 12345

        LoadModule log_config_module modules/mod_log_config.so
        LoadModule authz_host_module modules/mod_authz_host.so


        LoadModule authn_default_module modules/mod_authn_default.so
        #LoadModule authz_host_module modules/mod_authz_host.so
        LoadModule authz_user_module modules/mod_authz_user.so
        LoadModule authz_default_module modules/mod_authz_default.so
        LoadModule auth_basic_module modules/mod_auth_basic.so
        LoadModule auth_digest_module modules/mod_auth_digest.so

        #LoadModule log_config_module modules/mod_log_config.so
        LoadModule env_module modules/mod_env.so
        LoadModule mime_module modules/mod_mime.so
        LoadModule dir_module modules/mod_dir.so
        LoadModule alias_module modules/mod_alias.so
        LoadModule rewrite_module modules/mod_rewrite.so

        LoadModule wsgi_module modules/mod_wsgi.so

        ServerAdmin admin@(removed).com

        #DocumentRoot "/path/to/apache2/htdocs"

        <Directory />
                Options FollowSymLinks
                AllowOverride None
                Order deny,allow
                Deny from all
        </Directory>

        # Logging
        ErrorLog "logs/error_log"
        LogLevel warn
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i
\"" combined
        CustomLog "logs/access_log" combined

        # Virtual Hosting Setup

        ServerLimit 1
        MinSpareThreads 1
        MaxSpareThreads 5
        ThreadsPerChild 10

        <Directory /path/to/wsgi>
                Order allow,deny
                Allow from all
        </Directory>

        NameVirtualHost *:12345

        # Virtual Hosts

        <VirtualHost *:12345>
                ServerName (domain1).com
                KeepAlive Off
                WSGIDaemonProcess (domain1).com processes=1 threads=20 
inactivity-
timeout=60 display-name=[wsgi-scriptshare]httpd
                WSGIProcessGroup (domain1).com
                WSGIScriptAlias / /path/to/wsgi/scriptshare.wsgi
        </VirtualHost>

        <VirtualHost *:12345>
                ServerName (domain2).com
                ServerAlias www.(domain2).com
                KeepAlive Off
                WSGIDaemonProcess (domain2).com processes=1 threads=10 
inactivity-
timeout=60 display-name=[wsgi-everythingri]httpd
                WSGIProcessGroup (domain2).com
                WSGIScriptAlias / /path/to/wsgi/everythingri.wsgi
        </VirtualHost>

        <VirtualHost *:12345>
                ServerName (domain3).com
                KeepAlive Off

                # THIS SHOULD PASS HTTP_AUTHORIZATION TO DJANGO...
                WSGIPassAuthorization On

                WSGIDaemonProcess (domain3).com processes=1 threads=10 
inactivity-
timeout=60 display-name=[wsgi-dev-seemonkey]httpd
                WSGIProcessGroup (domain3).com
                WSGIScriptAlias / /path/to/wsgi/seemonkey.wsgi
        </VirtualHost>

I run this test program:


        import urllib
        import urllib2

        url = '(removed)'

        print 'URL: %s' % url

        headers = {
                'HTTP_AUTHORIZATION': '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
HTTP_AUTHORIZATION',
                'FAKE': '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! FAKE',
        }
        print 'headers: %s' % headers

        print 'Results:'

        #print 'sending headers: %s' % headers

        req = urllib2.Request(url, headers=headers)

        try:
                url1 = urllib2.urlopen(req)
        except Exception, e:
                print 'Exception:'
                print e
        else:
                response = url1.read()
                print 'response:'
                print '----------------------------------------'
                print response
                print '----------------------------------------'
                print ''

For "manage.py runserver", I get this result:
        URL: (django runserver url)
        headers: {'HTTP_AUTHORIZATION':
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! HTTP_AUTHORIZATION', 'FAKE':
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! FAKE'}
        Results:
        response:
        ----------------------------------------
          request.META[wsgi.version]: (1, 0)
          request.META[wsgi.multiprocess]: False
          request.META[RUN_MAIN]: 'true'
          request.META[SERVER_PROTOCOL]: 'HTTP/1.1'
          request.META[SERVER_SOFTWARE]: 'WSGIServer/0.1 Python/2.5.4'
          request.META[SCRIPT_NAME]: u''
          request.META[REQUEST_METHOD]: 'GET'
          request.META[PROCESSOR_REVISION]: '0f0b'
          request.META[QUERY_STRING]: ''
          request.META[HTTP_HTTP_AUTHORIZATION]:
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! HTTP_AUTHORIZATION'
          request.META[wsgi.errors]: <open file '<stderr>', mode 'w' at
0x00A400B0>
          request.META[CONTENT_LENGTH]: ''
          request.META[HTTP_CONNECTION]: 'close'
          request.META[REMOTE_HOST]: ''
          request.META[REMOTE_ADDR]: '127.0.0.1'
          request.META[SERVER_PORT]: '10002'
          request.META[SESSIONNAME]: 'Console'
          request.META[PROCESSOR_LEVEL]: '6'
          request.META[HTTP_FAKE]: '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
FAKE'
          request.META[USERNAME]: '(username)'
          request.META[wsgi.input]: <socket._fileobject object at 0x018B76B0>
          request.META[HTTP_USER_AGENT]: 'Python-urllib/2.5'
          request.META[HTTP_HOST]: 'localhost:10002'
          request.META[wsgi.multithread]: True
          request.META[PATHEXT]:
'.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH'
          request.META[PATH_INFO]: u'/(page_url)'
          request.META[SERVER_NAME]: '(server name)'
          request.META[GATEWAY_INTERFACE]: 'CGI/1.1'
          request.META[wsgi.run_once]: False
          request.META[DJANGO_SETTINGS_MODULE]: '(django app name).settings'
          request.META[CONTENT_TYPE]: 'text/plain'
          request.META[wsgi.file_wrapper]: <class
'django.core.servers.basehttp.FileWrapper'>
          request.META[OS]: 'Windows_NT'
          request.META[HTTP_ACCEPT_ENCODING]: 'identity'
          request.META[wsgi.url_scheme]: 'http'
        request.META.get('HTTP_AUTHORIZATION', None): None
        request.META.get('HTTP_HTTP_AUTHORIZATION', None):
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! HTTP_AUTHORIZATION'
        ----------------------------------------

The HTTP_HTTP_AUTHORIZATION shows up just fine.

But with the apache server, I get these results:
        URL: (apache url)
        headers: {'HTTP_AUTHORIZATION':
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! HTTP_AUTHORIZATION', 'FAKE':
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! FAKE'}
        Results:
        response:
        ----------------------------------------
          request.META[mod_wsgi.reload_mechanism]: '1'
          request.META[mod_wsgi.listener_port]: '29019'
          request.META[SERVER_SOFTWARE]: 'Apache/2.2.14 (Unix) mod_wsgi/2.5
Python/2.5.4'
          request.META[SCRIPT_NAME]: u''
          request.META[SERVER_SIGNATURE]: ''
          request.META[REQUEST_METHOD]: 'GET'
          request.META[PATH_INFO]: u'/(page url)'
          request.META[SERVER_PROTOCOL]: 'HTTP/1.0'
          request.META[QUERY_STRING]: ''
          request.META[HTTP_USER_AGENT]: 'Python-urllib/2.5'
          request.META[HTTP_CONNECTION]: 'close'
          request.META[SERVER_NAME]: '(server name)'
          request.META[REMOTE_ADDR]: '127.0.0.1'
          request.META[wsgi.url_scheme]: 'http'
          request.META[SERVER_PORT]: '80'
          request.META[wsgi.multiprocess]: True
          request.META[HTTP_FAKE]: '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
FAKE'
          request.META[SERVER_ADDR]: '127.0.0.1'
          request.META[mod_wsgi.process_group]: '(removed)'
          request.META[SCRIPT_FILENAME]: '(removed).wsgi'
          request.META[SERVER_ADMIN]: '(removed)'
          request.META[wsgi.input]: <mod_wsgi.Input object at 0xb03b8f48>
          request.META[HTTP_HOST]: '(removed)'
          request.META[wsgi.multithread]: True
          request.META[mod_wsgi.callable_object]: 'application'
          request.META[REQUEST_URI]: '/(removed)'
          request.META[wsgi.version]: (1, 0)
          request.META[GATEWAY_INTERFACE]: 'CGI/1.1'
          request.META[HTTP_X_FORWARDED_FOR]: '(removed)'
          request.META[wsgi.errors]: <mod_wsgi.Log object at 0xa348338>
          request.META[REMOTE_PORT]: '51174'
          request.META[mod_wsgi.listener_host]: ''
          request.META[mod_wsgi.version]: (2, 5)
          request.META[wsgi.run_once]: False
          request.META[mod_wsgi.application_group]: '(removed)|'
          request.META[mod_wsgi.script_reloading]: '1'
          request.META[wsgi.file_wrapper]: <built-in method file_wrapper of
mod_wsgi.Adapter object at 0xa268c80>
          request.META[HTTP_ACCEPT_ENCODING]: 'identity'
        request.META.get('HTTP_AUTHORIZATION', None): None
        request.META.get('HTTP_HTTP_AUTHORIZATION', None): None
        ----------------------------------------

The "FAKE" http header shows up as "HTTP_FAKE", but the
"HTTP_AUTHORIZATION" header doesn't show up at all.  It's being
filtered out, which is what you'd expect if the WSGIPassAuthorization
was Off.  I've restarted the server a ton, played with the http.conf,
and I'm stuck.

What other steps can I try to troubleshoot this?  My host is
webfaction, which runs Apache behind an nginx proxy frontend.  I'm not
sure if that makes a difference.  I've been using this fine on another
machine, but recently switched machines, then recompiled apache, and
now it doesn't work.  Something's wrong, but I'm out of ideas of where
to look.

Thanks so much for any help!

--

You received this message because you are subscribed to the Google Groups 
"modwsgi" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/modwsgi?hl=en.


Reply via email to