โพสต์ครั้งแรกที่นี่ ฉันค้นหาที่นี่มาประมาณสองวันแล้วเพื่อค้นหาวิธีแก้ไขปัญหาของฉันและไม่มีอะไรทำงาน

ฉันรู้ว่ามีโพสต์มากมายเกี่ยวกับปัญหาเดียวกันนี้ แต่ไม่มีวิธีแก้ไขปัญหาเธรดใดที่ฉันเจอ ได้ผลจนถึงตอนนี้ ฉันใช้ NodeJS กับ Angular 5 บนอินสแตนซ์ Amazon EC2

การนำทางไปยังhttps://example.comทำงานได้ดี หน้าเว็บโหลดอย่างถูกต้อง แต่http://example.comให้ "ยินดีต้อนรับสู่ nginx!" หน้าหนังสือ.

นี่คือบล็อกการกำหนดค่าเซิร์ฟเวอร์ nginx ของฉัน:

server {
    listen 443 ssl default_server;
    server_name example.com

    server_tokens off;
    charset utf-8;
}

... SSL config stuff ...

    location / {
      proxy_pass http://localhost:8000/;

      proxy_http_version 1.1;

      proxy_set_header Host               $host;
      proxy_set_header X-Real-IP          $remote_addr;
      proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto  $scheme;
      proxy_set_header Proxy "";
    }
}
server {
      listen 80;
      server_name example.com

      return 301 https://$host$request_uri;
}
  • พยายามเปลี่ยน default_server เป็นพอร์ต 80 block
  • พยายามใช้ $server_name แทน $host ในบรรทัดเปลี่ยนเส้นทาง
  • พยายามมีพอร์ต 80 บล็อกที่ด้านบนของพอร์ต 443 block
  • ตรวจสอบข้อผิดพลาดทางไวยากรณ์ในไฟล์ปรับแต่งแล้ว (ทุกอย่างเรียบร้อยดี)

ตรวจสอบไฟล์ที่ขัดแย้งกันด้วย (ไม่มีที่ฉันเห็นเชื่อมโยงกับ nginx.conf)

curl -I http://example.com
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Wed, 18 Jul 2018 04:18:49 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 31 Jan 2017 15:01:11 GMT
Connection: keep-alive
ETag: "5890a6b7-264"
Accept-Ranges: bytes

อย่างที่คุณเห็น เมื่อฉัน curl http://example.com (ไม่ใช่ example.com จริงๆ) มันจะคืนค่าสถานะ 200 แทนที่จะเป็น 301 นอกจากนี้ แท็บ "เครือข่าย" ในเครื่องมือสำหรับนักพัฒนาของ Firefox ยังแสดงสถานะ 304 .

answer

โปรดใช้$serverแทน$host

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

โปรดดูเอกสารด้านล่าง อาจมีประโยชน์ https://www.digitalocean.com/community/questions/best-way-to-configure-nginx-ssl-force-http-to-redirect-to-https-force-www-to-non-www -on-serverpilot-free-plan-by-using-nginx-configuration-file-only

ฉันกำลังตอบคำถามนี้แม้ว่าจะได้รับการยอมรับเพราะฉันคิดว่าคำตอบนั้นผิด

ฉันกำลังวางการกำหนดค่าของคุณด้านล่างตามที่เป็นโดยมีเพียงความคิดเห็นที่ชี้ไปยังตำแหน่งที่ไม่ถูกต้อง (ดูเหมือนพิเศษ) โค้งงอปิดบล็อกเซิร์ฟเวอร์:

server {
    listen 443 ssl default_server;
    server_name example.com

    server_tokens off;
    charset utf-8;
}                                 <--------- CLOSED BLOCK WITH EXTRA BRACKET

... SSL config stuff ...

    location / {
      proxy_pass http://localhost:8000/;

      proxy_http_version 1.1;

      proxy_set_header Host               $host;
      proxy_set_header X-Real-IP          $remote_addr;
      proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto  $scheme;
      proxy_set_header Proxy "";
    }
}
server {
      listen 80;
      server_name example.com

      return 301 https://$host$request_uri;
}

วิธีที่แนะนำคือใช้ the $hostอย่างที่คุณมีในตอนแรก $server_nameตัวแปรจะถูกแทนที่ด้วยคำนิยาม virtualhost แทน URL ที่ป้อนโดยผู้ใช้ ซึ่งอาจทำให้เกิดปัญหาได้หากคุณใช้ server_alias เป็นต้น คุณสามารถอ่านความหมายของแต่ละตัวแปรในเอกสาร Nginx อย่างเป็นทางการ นี่คือคำพูด:

$server_name
    name of the server which accepted a request 

$host
    in this order of precedence: host name from the request line, or host name from the “Host” request header field, or the server name matching a request 

ดังนั้น. ฉันคิดว่าปัญหาของคุณคือวงเล็บปีกกา ไม่ใช่ตัวแปร คุณควรกลับไปที่ $host และลองอีกครั้งหากใช้งานได้

ปล. ลบproxy_http_versionบรรทัดและเครื่องหมายproxy_set_header"" ที่ว่างเปล่าด้วย คุณไม่จำเป็นต้องมีกรณีการใช้งานที่เฉพาะเจาะจงมาก