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
今のところ正確な式とそれが正しいかどうかは思い出せませんが、試してみてください。