web-dev-qa-db-ja.com

Djangoアプリに到達する前にエイリアスURLパスが削除されないように、Apache / mod_wsgiを構成できますか?

Django WebサービスとPHP WebサイトをホストするようにApacheを構成しようとしています。

パターンwww.mysite.com/apiのすべてのURLはDjangoサービスに送信する必要があります。他のすべてのURL(例:www.mysite.com)はPHPウェブサイト。

私の仮想ホスト構成は次のようになります。

...
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>
...

これにより、各リクエストが正しいハンドラーに送信されます。ただし、私のDjango rls.pyは次のようになります:

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

これは、URLがapiで始まることを想定しているため、どのURLとも一致しません。もちろん、このプレフィックスはここに到達する前に削除されます(リクエストがここに到着すると、1.0/oauthなどの形式になります)。

完全に無傷のURLをDjangoに渡す方法はありますか?

解決

Mod_wsgiの作者であるGrahamDumpletonは、これを修正するためのいくつかのアプローチを提案しましたが、どちらも機能しました(以下の承認された回答を参照)。

私は彼がUPDATE1で提案した解決策を選びました。ファイルパスに/apiを追加すると、問題が解決します。

WSGIScriptAlias /api /var/www/mysite.com/Apache/Django.wsgi/api

つまり、/apiは、Djangoに到達するまでにURLから削除されなくなりました。

だからここに私の作業構成の関連部分があります:

...
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>
...

あなたが見ているのは、まさにそれが一般的にどのように機能することを意味するかです。 WSGIアプリケーションは、マウントされている場所に関する知識を気にしたり、埋め込んだりしてはなりません。つまり、urls.pyのプレフィックスとして「api」を使用しないでください。なぜurls.pyに「api」プレフィックスが必要だと思いますか?


更新1

次を使用できる場合があります。

WSGIScriptAlias /api /var/www/mysite.com/Apache/Django.wsgi/api

今のところ正確な式とそれが正しいかどうかは思い出せませんが、試してみてください。

5