将 Django REST API 部署到 api.example.com:Apache 2.2、mod_wsgi 和 mod_rewrite

Deploy Django REST API to api.example.com: Apache 2.2, mod_wsgi and mod_rewrite

几天来我一直在搜索关于这个主题的信息,但我一直 运行 遇到障碍。

我在 www.example.com 有一个 Django 网站和应用程序 运行ning,我强制使用 HTTPS。它使用 WSGI 部署在 Apache 2.2 上。这工作正常并且适用于 example.comwww.example.com.

我在 https://www.example.com/api/v1/ 也有一个 REST API (pip install djangorestframework) 运行ning。这也很好用。

我想从子域 https://api.example.com 运行 API 并将此 URL 保留在地址栏中。例如,要获取 JSON 个对象,我可能会使用这样的东西:

curl -X GET https://api.example.com/objects/ -H 'Authorization: Token xxx'

我现在可以用这个得到这个:

curl -X GET https://www.example.com/api/v1/objects/ -H 'Authorization: Token xxx'

我有一个用于此子域的单独 SSL 证书,并且他的已正确配置。

我在我的 Apache 配置中尝试了很多东西来完成这个但每次都失败了。我想我可以使用 mod_rewritehttps://www.example.com/api/v1/ 中静默获取内容,同时将 https://api.example.com 留在地址栏中。这可能吗?这是我尝试过的(在 sites-available 虚拟主机文件中):

RewriteEngine on
RewriteCond %{HTTP_HOST} ^api.example.com [NC]
RewriteRule ^(.*)$ https://www.example.com/api/v1/ [L]

我已经尝试了这个想法的几种变体,但都无济于事。我也玩过 HTTPS on/off,但没有真正的好处。

我读了几个地方,使用 mod_proxy 可以做到这一点,但是当我走这条路时,API 在所需的 [=66 处可用(经过相当多的调整) =] (https://api.example.com) 但我的静态内容 none 在那里,当我在 Django REST Framework UI 中点击一个亲戚 link 时,我会得到 404s 因为它正在查看:

https://api.example.com/api/v1/

Django 抱怨的是:/api/v1/api/v1/

我想我想做的就是让 https://api.example.com 成为 API 的基础 URL 就好像它是 https://www.example.com/api/v1/.

导致发现 django-hosts 包的重复项:

Django subdomain configuration for API endpoints

我一直在玩这个,它显示出希望,虽然我还没有 "solved" 我的问题。我计划在获得更多要分享的信息后编辑此答案。同时,如果有人使用 django-hosts 来解决我原来的问题,请在此处添加您的答案或至少发表一些评论!