我第一次尝试使用nginx,而且我是用docker做的。 基本上我想实现以下架构
http
请求都要重定向到https
我在启动时生成带有一些环境变量的/etc/nginx/conf.d/default.conf
文件。然后该文件包含在default.conf文件的http
上下文中,从而对我可以配置的内容带来一些限制。 (related issue)
您可以看到我当前的nginx.conf
file here(文件非常大,可以嵌入此处)。
你可以看到docker-compose.yml
file here。
我实际上无法将对http://(app/api).example.com
的任何调用重定向到其https
版本,我已尝试使用此功能但未成功:(请参阅上面的链接文件)
server {
listen 80 ssl;
listen 443 ssl;
listen [::]:80 ssl;
listen [::]:443 ssl;
server_name api.dev.local;
if ($http_x_forwarded_proto = "http") {
return 301 https://$server_name$request_uri;
}
# more code...
}
有关我的实际配置的任何建议都非常欢迎在评论部分!我刚开始使用nginx,因此阅读提供代码片段的tons of artciles,我只需在阅读完所需内容后进行复制和粘贴。
答案 0 :(得分:2)
https
协议是http
的扩展,因此它们在某种程度上是不同的协议。目前,您的服务器不希望http
开启:80,由于设置为https
,因此需要listen 80 ssl
。这会导致错误。
您需要将http
请求的处理单独处理:80,应该重定向到https
on:443,处理https
on:443,应该正常处理。
这可以通过在{80}上分割出server
的另一个http
配置块来完成:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
...并从当前区块中删除监听:80:
server {
listen 443 ssl;
listen [::]:443 ssl;
# more code...
}
以下博客文章根据需要提供了更多详细信息https://bjornjohansen.no/redirect-to-https-with-nginx