我正在使用Django REST framework构建API,该API通过Gunicorn和Nginx提供。项目“ exampleproject”必须在子路径中运行,例如:https://100.100.100.100/exampleproject(示例IP地址)。我没有为该IP注册的域名。
当前,起始页按预期在https://100.100.100.100/exampleproject处呈现。但是,“产品”的资源路径不起作用。起始页面显示https://100.100.100.100/exampleproject/products,而不是https://100.100.100.100/products-这不起作用。
我在exampleproject
中为/etc/nginx/sites-enabled/default
配置了子路径,如下所示:
server {
# ...
location /exampleproject/ {
proxy_pass http://localhost:8007/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
[当我手动访问https://100.100.100.100/exampleproject/products时,Nginx在/var/log/nginx/access.log
中记录了以下内容:
“ GET / products / HTTP / 1.1” 404 151“-”
只需从代理服务器传递URL中删除结尾的斜杠,如果指定proxy_pass时不带URI,则将请求URI以与原始请求处理时客户端发送的格式相同的形式传递给服务器,然后保持[C0 ]部分。
参见:/exampleproject/
然后,您需要配置Django以了解http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass下的URL。
首先,您可以像这样通过更新/exampleproject/
文件在所有URL前面添加子路径:
urls.py
而且,如果要提供静态信息和媒体,只需在设置中进行更新:
urlpatterns = [url(r'^exampleproject/', include(urlpatterns))]
当然,您可以创建一个自定义设置来复制此文件或使应用程序也没有子路径,我相信这是比MEDIA_URL = '/exampleproject/media/'
STATIC_URL = '/exampleproject/static/'
更好的解决方案,因为在这种情况下,我发现我们仍然需要更新Django URL 。