มีวิธีแชร์คำสั่งการกำหนดค่าข้ามสองserver {}บล็อกnginx หรือไม่? ฉันต้องการหลีกเลี่ยงการทำซ้ำกฎ เนื่องจากเนื้อหา HTTPS และ HTTP ของไซต์ของฉันมีการกำหนดค่าเดียวกัน

ปัจจุบันเป็นแบบนี้:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}

ฉันสามารถทำบางสิ่งตามบรรทัดของ:

server {
  listen 80, 443;
  ...

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

คุณสามารถรวมสิ่งนี้เป็นบล็อกเซิร์ฟเวอร์เดียวได้ดังนี้:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

ฮาวทูอย่างเป็นทางการ

เพื่อชี้แจงคำตอบที่ยอมรับ คุณต้องละเว้น

SSL on;

และคุณเพียงแค่ต้องการสิ่งต่อไปนี้สำหรับเวอร์ชัน nginx หลังจาก 0.8.21

listen 443 ssl;

อ้างอิง:

Nginx Docs - การกำหนดค่าเซิร์ฟเวอร์ HTTP/HTTPS เดียว

ฉันไม่รู้วิธีอย่างที่คุณแนะนำ แต่มีวิธีที่ง่ายและบำรุงรักษาได้อย่างแน่นอน

ย้ายการตั้งค่าเซิร์ฟเวอร์ทั่วไปไปยังไฟล์แยกต่างหาก เช่น "serverFoo.conf" จากนั้นincludeจึงแยกเป็นserver {}บล็อกต่างๆ ดังนี้:

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

การขยายคำตอบที่เป็นประโยชน์อยู่แล้ว ต่อไปนี้คือตัวอย่างที่สมบูรณ์ยิ่งขึ้น:

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;
}

เพียงเพื่อเพิ่มโพสต์ของ Igor/Jauder หากคุณกำลังฟัง IP เฉพาะ คุณสามารถใช้:

listen xxx.xxx.xxx.xxx;
listen xxx.xxx.xxx.xxx:443 default ssl;