nginx HTTPS与HTTP具有相同的配置


194

有没有一种方法可以在两个Nginx server {}块之间共享配置指令?我想避免重复规则,因为我网站的HTTPS和HTTP内容使用完全相同的配置提供。

目前,它是这样的:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}

我可以按照以下方式做点什么:

server {
  listen 80, 443;
  ...

  if(port == 443) {
    ssl on; #etc
  }
}

Answers:


262

您可以将其组合成一个服务器块,如下所示:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

官方方法


6
啊,我不知道nginx足够聪明,可以忽略通过端口80加载的SSL指令。太棒了!
ceejayoz

72
nginx是各种各样的WIN。
何浩达(Jauder Ho),2009年

5
并且如果您在一台服务器上有多个站点,则值得一提的是,“默认”不是必须的
luchaninov 2011年

4
如此优雅,真让人痛心……
Alix Axel 2012年

3
在这里不起作用...“普通的HTTP请求已发送到HTTPS端口”
gcstr 2014年


26

我不知道像您建议的方法,但是肯定有一种简单且可维护的方法。

将常用服务器设置移动到单独的文件(即“ serverFoo.conf”)中,然后将include其放在单独的server {}块中,如下所示:

server {
    listen 80;
    include serverFoo.conf;
}
server {
    listen 443 ssl;
    include serverFoo.conf;
}

2
+1 =对我有用。(无法使其与其他方法一起使用。)

另外,如果充当负载平衡器,则另一个示例不考虑“ proxy_pass”。
Mike Purcell

如果server_name每个端口
都不

5
不要使用ssl,listen 443 ssl;从现在开始使用。
危险89年

这似乎是使用最新的nginx 1.10.1的唯一解决方案。由于某些原因,两listen行的解释不正确,但是将它们分开移动即可server{}解决。
Artur Bodera '16

9

扩展已经有用的答案,这是一个更完整的示例:

server {

    # Listen on port 80 and 443
    # on both IPv4 and IPv6
    listen 80;
    listen [::]:80 ipv6only=on;
    listen 443 ssl;
    listen [::]:443 ipv6only=on ssl;

    # Set website folder
    root /path/to/your/website;

    # Enable SSL
    ssl_certificate your-cert.pem;
    ssl_certificate_key your-cert.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
    ssl_prefer_server_ciphers on;
}

2
我知道这是一个很老的答案,但因为它是很完整的我只是想指出别人谁可以使用它,你应该禁用SSLv3的协议作为其脆弱的狮子狗漏洞:disablessl3.com 而是使用:ssl_protocols的TLSv1的TLSv1 .1 TLSv1.2;
user147787 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.