Ben Talep https'ye tüm HTTP isteğini yönlendirmek istiyorum ELB . İki EC2 bulut sunucum var. Sunucu için nginx kullanıyorum. Herhangi bir başarı olmadan nginx conf dosyalarını yeniden yazmayı denedim. Bu konuda bazı tavsiyelerde bulunmak isterim.
Ben Talep https'ye tüm HTTP isteğini yönlendirmek istiyorum ELB . İki EC2 bulut sunucum var. Sunucu için nginx kullanıyorum. Herhangi bir başarı olmadan nginx conf dosyalarını yeniden yazmayı denedim. Bu konuda bazı tavsiyelerde bulunmak isterim.
Yanıtlar:
AWS Application Load Balancer'lar artık yerel HTTP'den HTTPS'ye yönlendirmeyi destekliyor.
Bunu konsolda etkinleştirmek için aşağıdakileri yapın:
Aynısı, burada açıklandığı gibi CLI kullanılarak da elde edilebilir .
Bunu, aşağıdaki gibi bir Dinleyici nesnesi kurmanız gereken Cloudformation'da da yapmak mümkündür:
HttpListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
LoadBalancerArn: !Ref LoadBalancer
Port: 80
Protocol: HTTP
DefaultActions:
- Type: redirect
RedirectConfig:
Protocol: HTTPS
StatusCode: HTTP_301
Port: 443
Hala Klasik Yük Dengeleyicileri kullanıyorsanız, diğerleri tarafından açıklanan NGINX yapılandırmalarından biriyle gidin.
instances
sekme olmadığı için )
ELB X-Forwarded-Proto
üstbilgiyi ayarlar , orijinal isteğin HTTP için olup olmadığını algılamak ve daha sonra HTTPS'ye yönlendirmek için kullanabilirsiniz.
Bunu server
conf'inizde deneyebilirsiniz :
if ($http_x_forwarded_proto = 'http') {
return 301 https://yourdomain.com$request_uri;
}
ELB belgelerine bir göz atın .
nginx
yapılandırma içindir, ancak ilke herhangi bir web sunucusu için geçerlidir.
Aynı sorunu yaşadım, benim durumumda HTTPS tamamen ELB tarafından ele alındı ve kaynak alanımı önceden bilmiyordum, bu yüzden şöyle bir şey yaptım:
server {
listen 81;
return 301 https://$host$request_uri;
}
server {
listen 80;
# regular server rules ...
}
Ve sonra elbette ELB "https" yi 80 nolu bulut sunucusu portuna ve sonra 81 nolu bulut sunucusu portuna 'http' yolunu işaret edin.
Amazon Elastic Load Balancer (ELB), X-FORWARDED-PROTO adlı bir HTTP üst bilgisini destekler. ELB'den geçen tüm HTTPS istekleri, "HTTPS" ye eşit X-FORWARDED-PROTO değerine sahip olacaktır. HTTP istekleri için, aşağıdaki basit yeniden yazma kuralı ekleyerek HTTPS'yi zorlayabilirsiniz. Benim için iyi çalışıyor!
Apaçi
.Htaccess dosyanıza aşağıdaki satırları ekleyebilirsiniz:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
Veya aynı EC2 web sunucusunda birden fazla etki alanını yönetmek için vhost.conf kullanıyorsanız, vhost.conf'a aşağıdakileri ekleyebilirsiniz (bunun için https kullanmak istediğiniz etki alanına ekleyin):
<VirtualHost *:80>
...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
...
</VirtualHost>
IIS
IIS Url-Rewrite modülünü kurun, GUI konfigürasyonunu kullanarak şu ayarları ekleyin:
<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>
Daha fazlasını buradan okuyun
RewriteCond %{HTTP:X-Forwarded-Proto} !(https|^$)
Yukarıdaki htaccess çözümleri ELB sağlık kontrolünün başarısız olmasına neden oldu. Birisinin benimle aynı sorunları yaşadığı bir makaleyi çevrimiçi bulana kadar çözümü bulmakta biraz sorun yaşadım. Onun çözümü, bunu htaccess dosyasının başına eklemekti:
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
ELB aracılığıyla harici istekleri HTTPS'ye yönlendirirken buna ve HTTP üzerinden diğer yerel isteklere izin vermek için, yeniden yazma koşulunu https'de negatif eşleşme yerine http ile eşleşecek şekilde ayarlayın.
Aradığınız çözüm olmayabilir, ancak başka bir seçenek ELB'ye ek olarak AWS CloudFront'u kullanmak olabilir. CloudFront, tüm gelen HTTP trafiğini HTTPS'ye yönlendirme seçeneği sunar.
Nginx ve ELB yapılandırmasıyla ilgili garip bir sorun yaşadım. Kurulumum ELB'nin arkasındaki bir nginx içinde 3 farklı hizmet içeriyordu. Ve karışık içerik sorunu yaşadım: ELB'ye isteğiniz https olduğunda, ancak yalnızca ELB http içinde ve sunucu http kullanarak statik için göreli yol oluşturduğunda, tarayıcı 'karışık içerik' sorunuyla başarısız olur. Ve hem http / https çalışması için herhangi bir yönlendirme olmadan çözüm oluşturmalıyım.
nginx/conf.d/
Klasörde bulunan yapılandırma :
# Required for http/https switching
map $http_x_forwarded_port $switch {
default off;
"80" off;
"443" on;
}
Bu, gerçek müşteri protokolünün ne olduğu bilgisine sahip olacağımız anlamına gelir. Gördüğünüz gibi, $switch
var. Ve şu anda bunu ihtiyacınız olan her yerde kullanıyorsunuz:
location ~ /softwareapi/index.php {
fastcgi_param HTTPS $switch;
.. other settings here ..
}
HTTPS ayarıyla php uygulaması doğru protokolü otomatik olarak algılar ve karışık içerik sorununu önlemek için dikkatli bir şekilde göreceli yol oluşturur.
Saygılarımla.
@ Ulli'nin cevabına göre Bunu Terraform kullanarak yapılandırmak istiyorsanız , işte bir örnek>
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"
}
}
}
.ebextensions/00_forward_http_to_https.config
Aşağıdaki içeriğe sahip bir dosya oluşturun :
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"
Önceden AWS yönetim konsolundan APP_URL ortam değişkenini ayarladığınızdan emin olun.