การทำ Redirect HTTP ไป HTTPS ใน NGINX จะใช้ คอนฟิกประมาณนี้

server {
    listen 80;
    server_name _;
    return 301 https://$host$request_uri;
}

แล้ว Kong ละมันทำยังไง ?

มีคนถามไว้นานแล้ว ที่ Kong Nation ว่า "Redirect Kong non SSL to SSL" เมื่อตอน 20 April 2018 อห. นานแล้วนี่หว่า มีหลายๆคนมาคอนเม้นตอบ วิธีการ work around เช่น แก้ nginx custom template ของ kong หรือใช้ Pre-Function ที่เป็น Serverless Plugin ของ Kong ในการเช็ค scheme ก็ช่วยตัวเองกันไป

Kong ก็ฟังคนใช้แหละ แต่กว่าจะออกมารองรับ ก็ที่ Version 1.2.0 จิ้มไปดู CHANGELOG ได้ที่ https://github.com/Kong/kong/blob/master/CHANGELOG.md#core-6

จากบล็อกที่แล้ว เรื่อง "KONG DB-LESS HTTPS CONFIG" จะใช้ได้ทั้ง HTTP/HTTPS ถ้าอยากให้ใช้ได้แค่ HTTPS อย่างเดียว ถ้าเข้า HTTP ให้รีไดเรคไป HTTPS แก้คอนฟิกตามนี้

_format_version: '1.1'
services:
- name: httpbin-svc
  url: http://httpbin.org/
  routes:
  - name: httpbin-route
    hosts:
    - kong.dev
    protocols:
    - https
    https_redirect_status_code: 302

certificates:
- cert: "-----BEGIN CERTIFICATE-----..."
  key: "-----BEGIN PRIVATE KEY-----..."
  snis:
  - name: kong.dev

ที่เพิ่มมาคือ protocols และ https_redirect_status_code ซึ่ง 2 ตัวนี้มีค่า default ของมันอยู่ คือ

  • protocols: ["http", "https" ]
  • https_redirect_status_code: 426

ถ้าไม่แก้ protocols ให้เหลืออันเดียว มันจะใช้ได้ทั้ง HTTP/HTTPS ต้องแก้ และถ้าไม่แก้ https_redirect_status_code มันจะไม่รีไดเรค แต่จะได้ error นี้คือ

curl -v kong.dev
* Rebuilt URL to: kong.dev/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to kong.dev (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: kong.dev
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 426
< Date: Fri, 30 Aug 2019 11:33:37 GMT
< Content-Type: application/json; charset=utf-8
< Connection: keep-alive
< Connection: Upgrade
< Upgrade: TLS/1.2, HTTP/1.1
< Content-Length: 39
<
* Connection #0 to host kong.dev left intact
{"message":"Please use HTTPS protocol"}

ถ้าแก้ให้เป็น 301, 302 มันถึงจะรีไดเรคให้

จบละ เขียนไว้กันลืม