Posso configurar o apache / mod_wsgi para que o caminho da URL do Alias não seja removido antes de chegar ao meu aplicativo Django?

2

Estou tentando configurar o Apache para hospedar um webservice do Django e um site PHP.

Todas as URLs com o padrão www.mysite.com/api devem ser direcionadas para o serviço Django. Todos os outros URLs (por exemplo, www.mysite.com ) devem ser direcionados para o site do PHP.

Minha configuração de host virtual é assim:

...
WSGIScriptAlias /api /var/www/mysite.com/apache/django.wsgi
<Directory /var/www/mysite.com/apache>
    Order allow,deny
    Allow from all
</Directory>

Alias / /var/www/mysite.com/apache/php/
<Directory /var/www/mysite.com/apache/php>
    Options Indexes FollowSymLinks
    AllowOverride All
    Order Deny,Allow
    Allow from all
</Directory>
...

Isso direciona cada solicitação para o manipulador correto. No entanto, meu Django urls.py se parece com isso:

...
api_patterns = patterns('',
    url(r'^api/1.0/$', views.api_root),
    url(r'^api/1.0/oauth/', 
        include('oauth2_provider.urls', 
                namespace='oauth2_provider')),
...

Isso não corresponde a nenhum URL porque espera que eles comecem com api . Este prefixo é, naturalmente, retirado antes de chegar aqui (quando os pedidos chegam aqui eles estão no formato 1.0/oauth etc.).

Existe alguma maneira de passar um URL totalmente intacto para o Django?

Solução

Graham Dumpleton, autor de mod_wsgi, sugeriu algumas abordagens para corrigir isso, e ambas funcionaram (veja a resposta aceita abaixo).

Eu fui para a solução que ele sugere no UPDATE 1. Anexando /api ao caminho do arquivo resolve o problema:

WSGIScriptAlias /api /var/www/mysite.com/apache/django.wsgi/api

i.e. /api não é mais retirado da URL no momento em que alcança o Django.

Então, aqui estão as partes relevantes da minha configuração de trabalho:

...
DocumentRoot /var/www/mysite.com/apache/php

WSGIScriptAlias /api /var/www/mysite.com/apache/service/django.wsgi/api
<Directory /var/www/mysite.com/apache/service>
    WSGIProcessGroup www.mysite.com
    WSGIPassAuthorization On
    Options -Indexes
    Order allow,deny
    Allow from all
</Directory>

# PHP web site
<Directory /var/www/mysite.com/apache/php>
    Options -Indexes FollowSymLinks
    AllowOverride All
    Order Deny,Allow
    Allow from all
    DirectoryIndex index.php
</Directory>
...
    
por David Jones - iPushPull 19.11.2013 / 11:58

1 resposta

5

O que você está vendo é exatamente como isso geralmente funciona. Um aplicativo WSGI não deve se importar nem incorporar o conhecimento sobre onde está sendo montado. Em outras palavras, você não deve ter 'api' como um prefixo em urls.py. Por que você acredita que precisa do prefixo 'api' em urls.py?

ATUALIZAÇÃO 1

Você pode usar:

WSGIScriptAlias /api /var/www/mysite.com/apache/django.wsgi/api

Não me lembro da fórmula exata agora e se isso está correto, mas tente.

    
por 19.11.2013 / 12:08