我正在使用Flask,MariaDB,Nginx,Gunicorn和Docker托管我的网页。我正在使用4个单独的Docker容器(Flask +让我们进行加密,Nginx,Gunicorn和MariaDB),并且网站完全正常运行,通过https连接所有请求,但是通过以下方式重定向时:
return redirect(url_for('main.home'))
地址不解析为
,而是解析为我的docker-compose.yml文件中指定的gunicorn服务的名称:
gunicornservice / home
请注意,我的Flask应用程序是一个名为“ main”的Blueprint()。 url_for()调用中指定的位置是为“ main”指定的路由功能的名称:
@main.route("/home")
def home():
return render_template('home.html')
我尝试编辑nginx的配置文件,因为我相信这是解决方案所在,因为这可能是转发问题。我在SO上找到了一些类似的帖子,其中之一使用_external = True作为url_for()中的第二个参数引用,但这仅将地址解析为 mywebsite.com/home,它给出了相同的错误
“无法访问此网站
找不到gunicornservice的服务器IP地址。
DNS_PROBE_FINISHED_NXDOMAIN”
我的Nginx配置文件:
events { }
http {
upstream upstream-web {
server jonathanolson.us;
}
server {
listen 80;
server_name gunicornservice;
location / {
root /NHL-Project/flasksite/static;
proxy_pass http://gunicornservice:8000;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/jonathanolson.us/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/jonathanolson.us/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = jonathanolson.us) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name jonathanolson.us;
return 404; # managed by Certbot
}
}
我希望通过致电
获得结果return redirect(url_for('main.home'))
返回URL:
但是,它返回URL:
“ gunicornservice / home”
如何调用重定向(url_for())返回我网站的正确页面,例如https://mywebsite.com/home?
答案 0 :(得分:0)
也许设置SERVER_NAME会有所帮助。
答案 1 :(得分:0)
我在SO的另一篇文章中找到了解决方案。在我的代码中插入了更多内容之后,出现了400错误,指出“普通的HTTP请求已发送到HTTPS端口”,这导致我进入了这样的帖子:Dealing with nginx 400 "The plain HTTP request was sent to HTTPS port" error
在这篇文章中,this answer说明了如何插入配置规范,该规范将把HTTP请求正确转发到https。
答案 2 :(得分:0)
我有一个与这篇文章中描述的问题类似的问题,但是我不得不依靠不同的解决方案。
在我的docker-compose文件中,如下设置nginx端口。
nginx:
ports:
- 1337:80
调用重定向命令时,
redirect(url_for('main.home'))
它转发到http:// localhost / requested_uri
不要像我怀疑的那样访问http:// localhost:1337 / requested_uri。
解决方案是更改nginx.config文件中的主机定义。
location / {
proxy_set_header Host $host;
已更改为:
location / {
proxy_set_header Host $http_host;
区别在于$ host返回$ http_host小写且没有端口号。
使用$ http_host为我解决了重定向问题。