Django 防止Nginx更改主机

Django 防止Nginx更改主机,django,nginx,networking,server,ngrok,Django,Nginx,Networking,Server,Ngrok,我正在构建一个正在本地主机上运行的应用程序。我有我的整个停靠应用程序,并运行在https://localhost/. HTTP请求正在重定向到HTTPS 我在docker-compose.yml中的nginx配置正在按其应有的方式处理所有请求 我希望我的应用程序可以从任何地方访问,因此我尝试使用Ngrok将请求路由到本地主机。事实上,我有一个移动应用程序在开发中,所以需要一个本地服务器的API 现在,当我在浏览器中输入ngrok的url(如abc123.ngrok.io)时,nginx将其转换为

我正在构建一个正在本地主机上运行的应用程序。我有我的整个停靠应用程序,并运行在https://localhost/. HTTP请求正在重定向到HTTPS

我在docker-compose.yml中的nginx配置正在按其应有的方式处理所有请求

我希望我的应用程序可以从任何地方访问,因此我尝试使用Ngrok将请求路由到本地主机。事实上,我有一个移动应用程序在开发中,所以需要一个本地服务器的API

现在,当我在浏览器中输入ngrok的url(如abc123.ngrok.io)时,nginx将其转换为https://localhost/. 这适用于我的主机系统的浏览器,因为我的web应用程序只在那里工作,但当我在移动模拟器中打开它时。它不起作用

我是nginx的新手。欢迎提出任何建议。 这是我的nginx配置

nginx.conf

upstream web {
    ip_hash;
    server web:443;
}

# Redirect all HTTP requests to HTTPS
server {
    listen 80;
    server_name localhost;
    return 301 https://$server_name$request_uri;
}

# for https requests
server {

    # Pass request to the web container
    location / {
        proxy_pass https://web/;
    }

    location /static/ {
        root /var/www/mysite/;
    }
    
    listen 443 ssl;
    server_name localhost;

    # SSL properties
    # (http://nginx.org/en/docs/http/configuring_https_servers.html)    
    ssl_certificate /etc/nginx/conf.d/certs/localhost.crt;
    ssl_certificate_key /etc/nginx/conf.d/certs/localhost.key;
    root /usr/share/nginx/html;    
    add_header Strict-Transport-Security "max-age=31536000" always;
}

这是我从教程中获得的配置。

首先,您可以将每个HTTP请求的重定向设置为HTTPS:

将所有HTTP请求重定向到HTTPS 服务器{ 听80; 服务器名称localhost; 返回301 https://$server\u name$request\u uri; } 您在此处使用$server\u name变量,因此对应用程序的每个/some/path?请求字符串HTTP请求都将重定向到https://localhost/some/path?request_string. 至少将return指令更改为

返回301 https://$host$request\u uri; 有关$host和$server\u name变量之间差异的信息,请查看问题

如果这些是nginx配置中唯一的服务器块,则可以安全地删除服务器名称localhost;指令,这些块仍然是80和443 TCP端口上所有传入请求的默认块

第二个问题出现在abc123.ngrok.io上,即如果您正在为localhost使用自签名证书,那么准备好浏览器会抱怨为localhost颁发的证书不匹配。如果它没有破坏您的移动应用程序,则可以,但如果它是,您可以从Lets Encrypt免费获得您的abc123.ngrok.io域的证书。在您启动ngrok连接后,请查看页面以获取可用的ACME客户端和选项。或者,如果调试过程不严格要求HTTPS,则可以禁用HTTPS,只需使用以下单个服务器块:

服务器{ 听80; 将请求传递给web容器 地点/{ 代理通行证https://web/; } 位置/静态/{ root/var/www/mysite/; } } 当然,这不应用于生产,而应仅用于调试

最后一个。我看不出在docker本身内部加密nginx和web容器之间的流量有任何意义,特别是如果您已经使用nginx设置了HTTP到HTTPS重定向。它在安全性方面没有给你什么,只会给你一些额外的开销。在端口80上使用普通HTTP协议进行nginx和web容器之间的通信:

上游网络{ ip_散列; 服务器网络:80; } 服务器{ ... 地点/{ 代理通行证http://web; } }
谢谢你的全面回答,这肯定很有帮助。我现在无法检查。如果它真的有效,我会投票的。按照你的建议更改。虽然我需要HTTPS,所以只替换了$server\u名称。仍然转到ngrok url会自动更改为localhost。而且,即使只为http使用了单个服务器块。它仍然将我重定向到localhost。我知道它没有那么重要,但仍然如此。@Taranjeethingh您确定它不是您的浏览器缓存的重定向吗?运行curl-i abc123.ngrok.io并检查其输出。或者最好把结果加到你的问题上。哦,是的,这很有效。但是怎么可能呢?我之前在隐姓埋名模式下试过。不管怎样,我的错。谢谢,我明白了。