Saya ingin mengarahkan semua permintaan HTTP ke permintaan https di ELB . Saya memiliki dua instans EC2. Saya menggunakan nginx untuk server. Saya telah mencoba menulis ulang file conf nginx tanpa hasil. Saya ingin nasihat tentang itu.
Saya ingin mengarahkan semua permintaan HTTP ke permintaan https di ELB . Saya memiliki dua instans EC2. Saya menggunakan nginx untuk server. Saya telah mencoba menulis ulang file conf nginx tanpa hasil. Saya ingin nasihat tentang itu.
Jawaban:
Application Load Balancers AWS sekarang mendukung pengalihan HTTP ke HTTPS asli.
Untuk mengaktifkan ini di konsol, lakukan hal berikut:
Hal yang sama dapat dicapai dengan menggunakan CLI seperti yang dijelaskan di sini .
Anda juga dapat melakukan ini di Cloudformation, di mana Anda perlu menyiapkan objek Pendengar seperti ini:
HttpListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
LoadBalancerArn: !Ref LoadBalancer
Port: 80
Protocol: HTTP
DefaultActions:
- Type: redirect
RedirectConfig:
Protocol: HTTPS
StatusCode: HTTP_301
Port: 443
Jika Anda masih menggunakan Classic Load Balancers, gunakan salah satu konfigurasi NGINX yang dijelaskan oleh yang lain.
instances
tab)
ELB menyetel X-Forwarded-Proto
header, Anda dapat menggunakannya untuk mendeteksi apakah permintaan asli adalah HTTP dan kemudian dialihkan ke HTTPS.
Anda dapat mencoba ini di server
konfigurasi Anda :
if ($http_x_forwarded_proto = 'http') {
return 301 https://yourdomain.com$request_uri;
}
Lihat dokumen ELB .
nginx
konfigurasi, tetapi prinsipnya dapat diterapkan ke server web mana pun.
Saya memiliki masalah yang sama, dalam situasi saya HTTPS ditangani sepenuhnya oleh ELB dan saya tidak tahu domain sumber saya sebelumnya, jadi saya akhirnya melakukan sesuatu seperti:
server {
listen 81;
return 301 https://$host$request_uri;
}
server {
listen 80;
# regular server rules ...
}
Dan tentu saja mengarahkan ELB 'https' ke port instance 80 dan kemudian 'http' route ke port instance 81.
Amazon Elastic Load Balancer (ELB) mendukung header HTTP yang disebut X-FORWARDED-PROTO. Semua permintaan HTTPS melalui ELB akan memiliki nilai X-FORWARDED-PROTO yang sama dengan "HTTPS". Untuk permintaan HTTP, Anda dapat memaksa HTTPS dengan menambahkan aturan penulisan ulang sederhana berikut. Bagi saya ini berfungsi dengan baik!
Apache
Anda dapat menambahkan baris berikut di file .htaccess Anda:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
Atau jika Anda menggunakan vhost.conf untuk mengelola beberapa domain di server web EC2 yang sama, maka Anda dapat menambahkan berikut ini ke vhost.conf (tambahkan ke domain yang ingin Anda gunakan https untuk itu):
<VirtualHost *:80>
...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
...
</VirtualHost>
IIS
Instal modul IIS Url-Rewrite, menggunakan konfigurasi GUI, tambahkan pengaturan berikut:
<rewrite xdt:Transform="Insert">
<rules>
<rule name="HTTPS rewrite behind ELB rule" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions>
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{SERVER_NAME}{URL}" />
</rule>
</rules>
</rewrite>
Baca lebih lanjut di sini
RewriteCond %{HTTP:X-Forwarded-Proto} !(https|^$)
Solusi htaccess di atas menyebabkan health check ELB gagal. Saya mengalami kesulitan menemukan solusinya sampai saya menemukan artikel online di mana seseorang memiliki masalah yang sama dengan saya. Solusinya adalah menambahkan ini ke awal file htaccess sebagai gantinya:
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Untuk mengizinkan ini dan permintaan lokal lainnya melalui HTTP sambil mengalihkan permintaan eksternal melalui ELB ke HTTPS, sesuaikan kondisi penulisan ulang agar cocok dengan http, bukan pencocokan negatif di https.
Ini mungkin bukan solusi yang mungkin Anda cari, tetapi opsi lainnya adalah menggunakan AWS CloudFront selain ELB. CloudFront memberikan opsi untuk mengalihkan semua lalu lintas HTTP yang masuk ke HTTPS.
Saya punya masalah aneh dengan konfigurasi nginx dan ELB. Pengaturan saya menyertakan 3 layanan berbeda di dalam satu nginx di belakang ELB. Dan saya memiliki masalah konten campuran: ketika permintaan Anda ke ELB adalah https, tetapi di dalam ELB http saja, dan server membuat jalur relatif ke statis menggunakan http, jadi browser gagal dengan masalah 'konten campuran'. Dan saya harus membuat solusi untuk kedua http / https bekerja tanpa pengalihan.
Berikut adalah konfigurasi yang terletak di nginx/conf.d/
folder:
# Required for http/https switching
map $http_x_forwarded_port $switch {
default off;
"80" off;
"443" on;
}
Artinya kita akan mengetahui apa itu protokol klien yang sebenarnya. Seperti yang Anda lihat, kami akan memilikinya di $switch
var. Dan saat ini Anda menggunakan ini di semua lokasi di mana Anda membutuhkannya:
location ~ /softwareapi/index.php {
fastcgi_param HTTPS $switch;
.. other settings here ..
}
Dengan pengaturan HTTPS, aplikasi php akan secara otomatis mendeteksi protokol yang benar dan dengan hati-hati membangun jalur relatif untuk mencegah masalah konten campuran.
Salam Hormat.
Berdasarkan jawaban @ Ulli Jika Anda ingin mengkonfigurasinya menggunakan Terraform , berikut adalah contoh>
resource "aws_alb_listener" "web" {
load_balancer_arn = "${aws_alb.web.arn}"
port = "80"
protocol = "HTTP"
default_action {
type = "redirect"
redirect {
port = "443"
protocol = "HTTPS"
status_code = "HTTP_301"
}
}
}
Buat file .ebextensions/00_forward_http_to_https.config
dengan konten berikut:
files:
/tmp/deployment/http_redirect.sh:
mode: "000755"
content: |
APP_URL=`/opt/elasticbeanstalk/bin/get-config environment --output yaml | grep -oP 'APP_URL: \K([^\s)\"](?!ttp:))+'`
sed -ie 's@$proxy_add_x_forwarded_for;@$proxy_add_x_forwarded_for;\n if ($http_x_forwarded_proto = 'http') { return 301 https://'"$APP_URL"'$request_uri; }@' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf
container_commands:
http_redirect:
command: "/tmp/deployment/http_redirect.sh"
Pastikan untuk mengatur variabel lingkungan APP_URL dari konsol manajemen AWS sebelumnya.