nginx HTTPS 使用与 HTTP 相同的配置

cee*_*yoz 215 nginx https

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

目前,它是这样的:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}
Run Code Online (Sandbox Code Playgroud)

我可以做一些类似的事情:

server {
  listen 80, 443;
  ...

  if(port == 443) {
    ssl on; #etc
  }
}
Run Code Online (Sandbox Code Playgroud)

Jau*_* Ho 292

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

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}
Run Code Online (Sandbox Code Playgroud)

官方操作指南

  • nginx 是各种 WIN。 (75认同)
  • 啊,我不知道如果通过端口 80 加载,nginx 足够智能以忽略 SSL 指令。太棒了! (7认同)
  • 如果您在一台服务器上有多个站点,则值得一提的是“默认”不是强制性的 (6认同)
  • 优雅得让人心疼…… (4认同)
  • 在这里不起作用...“纯 HTTP 请求已发送到 HTTPS 端口” (3认同)

小智 92

为了澄清接受的答案,您需要省略

SSL on;
Run Code Online (Sandbox Code Playgroud)

并且您只需要以下 0.8.21 之后的 nginx 版本

listen 443 ssl;
Run Code Online (Sandbox Code Playgroud)

参考:

Nginx 文档 - 配置单个 HTTP/HTTPS 服务器

  • 谢谢!我不明白为什么 http 上没有任何工作。删除 SSL;工作。 (2认同)

dwc*_*dwc 32

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

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

server {
    listen 80;
    include serverFoo.conf;
}
server {
    listen 443 ssl;
    include serverFoo.conf;
}
Run Code Online (Sandbox Code Playgroud)

  • 不要使用ssl,使用```listen 443 ssl;``` 从现在开始。 (5认同)
  • +1 = 对我有用。(无法让它与其他方法一起工作。) (2认同)

Jon*_*han 12

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

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 我知道这是一个很旧的答案,但由于它非常完整,我只想向可能使用它的其他人指出您应该禁用 SSLv3 协议,因为它容易受到 POODLE 漏洞的影响:https://disablessl3.com/ 相反使用:ssl_protocols TLSv1 TLSv1.1 TLSv1.2; (2认同)

小智 5

只是添加到 Igor/Jauder 的帖子中,如果您正在收听特定的 IP,则可以使用:

listen xxx.xxx.xxx.xxx;
listen xxx.xxx.xxx.xxx:443 default ssl;
Run Code Online (Sandbox Code Playgroud)