使用SSL、AWS负载平衡器、Nginx和Gunicorn的Django Rest框架具有复杂堆栈的错误超链接
我无法找到如何正确设置使用SSL、AWS负载平衡器、Nginx和Gunicorn的Django Rest框架具有复杂堆栈的错误超链接,django,amazon-web-services,ssl,nginx,django-rest-framework,Django,Amazon Web Services,Ssl,Nginx,Django Rest Framework,我无法找到如何正确设置nginx,因此我在DRF构建的API中的超链接是正确的 我当前对nginx的配置是: upstream web { ip_hash; server web:8000; } # portal server { listen 8000; server_name localhost; location / { proxy_set_header Host $host:$server_port; proxy_se
nginx
,因此我在DRF构建的API中的超链接是正确的
我当前对nginx
的配置是:
upstream web {
ip_hash;
server web:8000;
}
# portal
server {
listen 8000;
server_name localhost;
location / {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://web/;
}
}
nginx
在容器内运行,暴露端口8000
,并将其映射到8000
上的内部运行的gunicorn(也在容器中)。因此,当我启动整个docker机器时,我可以很好地访问localhost:8000/api
,链接呈现正常。即使我使用不同的域访问它(例如,如果我设置了/etc/hosts
:127.0.0.1 mytest.com
),URL和端口也会正确地传递到DRF,链接会按预期呈现
但此服务必须位于AWS负载平衡器之后,证书使用SSL。此LB上的主机名设置为
otherdomain.com
,它将流量重定向到使用端口8000上的HTTP运行上述nginx
的计算机。然后,当尝试使用https://otherdomain.com/api
,链接呈现为http://otherdomain.com:8000/api/
添加到您的设置.py
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
SECURE_SSL_REDIRECT = not DEBUG
kotrfa编辑:相关。我不想添加第二行,因此仍然可以不使用HTTPS直接访问服务器,例如在本地主机上测试时。为此,我必须在
nginx
中设置两个不同的服务器,一个是在来自负载平衡器(例如7779)的同一端口上使用硬编码的Host my.domain.org
,另一个是在7778上使用Host$Host:$port
,这样就可以在VPN后面或本地主机上直接访问,链接仍然有效:-) 添加到您的设置.py
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
SECURE_SSL_REDIRECT = not DEBUG
kotrfa编辑:相关。我不想添加第二行,因此仍然可以不使用HTTPS直接访问服务器,例如在本地主机上测试时。为此,我必须在
nginx
中设置两个不同的服务器,一个是在来自负载平衡器(例如7779)的同一端口上使用硬编码的Host my.domain.org
,另一个是在7778上使用Host$Host:$port
,这样就可以在VPN后面或本地主机上直接访问,链接仍然有效:-) 您是否已添加到设置.py
SECURE\u PROXY\u SSL\u HEADER=('HTTP\u X\u FORWARDED\u PROTOCOL','https')
和SECURE\u SSL\u REDIRECT=not DEBUG
解决了这个问题,谢谢您添加到设置.py
SECURE\u PROXY\u SSL\u HEADER=('HTTP\u X\u FORWARDED\u PROTOCOL','https')
和SECURE\u SSL\u REDIRECT=not DEBUG
解决了这个问题,谢谢