我有一个运行在http://localhost:12345上的django应用程序。我想让用户通过url http://my.server.com/myapp访问它。我使用nginx反向代理到它,如下所示:
... ...
server_name my.server.com;
location /myapp {
rewrite /myapp(.*) $1 break;
... ... # proxy param
proxy_pass http://localhost:12345;
}
... ...
问题是,当像上面这样配置时,如何使我的响应页面中的url有一个前缀“/myapp”,以便nginx可以正确地将它们定向到myapp。例如,像“/foo/far”这样的页面中的url应该改为“/myapp/foo/bar”,以允许nginx代理myapp。正确的nginx配置是使用什么来实现这一点?
我可以使用django的设置变量来指定根url前缀,但我认为这并不灵活,因为变量必须根据不同的nginx配置进行修改(比如说有一天nginx可能会将suburl从“/myapp”改为“/anotherapp”)。
3条答案
按热度按时间nbewdwxp1#
因为前缀是在Nginx中设置的,所以托管Django应用的Web服务器无法知道URL前缀。正如orzel所说,如果你使用apache+mod_wsgi或者nginx+gunicorn/uwsgi(需要一些额外的配置),你可以使用WSGIScriptAlias值,Django会自动读取这个值。
当我需要使用URL前缀时,我通常会自己将其放在根目录www.example.com中urls.py,其中只有一行,以前缀为前缀,并包含另一个urls.py
但我想这与在www.example.com中设置前缀有着相同的瓶颈settings.py,在nginx和Django中有冗余配置。
你需要在Django应用所在的服务器上做一些事情:12345。你可以在那里设置前缀,然后使用WSGIScriptAlias或mod_wsgi之外的等价物将其传递给Django。我无法给予更多信息,因为我不知道你的Django应用是如何运行的。另外,也许你应该考虑直接从Django运行Django应用,使用uWSGI或gunicorn。
要将前缀从Web服务器传递给Django,可以使用以下代码:
更多信息here
9ceoxa922#
您需要更新您的设置:
并相应地更新您的
MEDIA_URL
和STATIC_URL
。我没有在nginx下部署的经验,但是在apache下,它工作得很好。
参见:https://docs.djangoproject.com/en/dev/ref/settings/#use-x-forwarded-host
yfjy0ee73#
这是我的nginx配置的一部分,我承认它没有设置FORCE_SCRIPT_NAME,但是我没有使用子目录。也许它会对在nginx而不是Django中设置与USE_X_FORWARDED_HOST相关的选项有用。