Voglio reindirizzare tutte le richieste HTTP alla richiesta https su ELB . Ho due istanze EC2. Sto usando nginx per il server. Ho provato a riscrivere i file di configurazione di nginx senza alcun successo. Mi piacerebbe un consiglio in merito.
Voglio reindirizzare tutte le richieste HTTP alla richiesta https su ELB . Ho due istanze EC2. Sto usando nginx per il server. Ho provato a riscrivere i file di configurazione di nginx senza alcun successo. Mi piacerebbe un consiglio in merito.
Risposte:
Gli AWS Application Load Balancer ora supportano il reindirizzamento nativo da HTTP a HTTPS.
Per abilitarlo nella console, procedi come segue:
Lo stesso può essere ottenuto utilizzando la CLI come descritto qui .
È anche possibile farlo in Cloudformation, dove è necessario impostare un oggetto Listener come questo:
HttpListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
LoadBalancerArn: !Ref LoadBalancer
Port: 80
Protocol: HTTP
DefaultActions:
- Type: redirect
RedirectConfig:
Protocol: HTTPS
StatusCode: HTTP_301
Port: 443
Se utilizzi ancora i Classic Load Balancer, segui una delle configurazioni NGINX descritte dagli altri.
instances
scheda)
ELB imposta l' X-Forwarded-Proto
intestazione, puoi usarlo per rilevare se la richiesta originale era su HTTP e reindirizzare a HTTPS.
Puoi provare questo nella tua server
configurazione:
if ($http_x_forwarded_proto = 'http') {
return 301 https://yourdomain.com$request_uri;
}
Dai un'occhiata ai documenti ELB .
nginx
config, ma il principio è applicabile a qualsiasi server web.
Ho avuto lo stesso problema, nella mia situazione HTTPS era gestito interamente da ELB e non conoscevo il mio dominio di origine in anticipo, quindi ho finito per fare qualcosa del tipo:
server {
listen 81;
return 301 https://$host$request_uri;
}
server {
listen 80;
# regular server rules ...
}
E poi ovviamente puntando l'ELB "https" alla porta 80 dell'istanza e quindi il percorso "http" alla porta 81 dell'istanza.
Amazon Elastic Load Balancer (ELB) supporta un'intestazione HTTP chiamata X-FORWARDED-PROTO. Tutte le richieste HTTPS che passano attraverso ELB avranno il valore di X-FORWARDED-PROTO uguale a "HTTPS". Per le richieste HTTP, puoi forzare HTTPS aggiungendo la seguente semplice regola di riscrittura. Per me funziona bene!
Apache
Puoi aggiungere le seguenti righe nel tuo file .htaccess:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
Oppure, se utilizzi vhost.conf per la gestione di più domini nello stesso server Web EC2, puoi aggiungere quanto segue a vhost.conf (aggiungilo al dominio che desideri utilizzare https per esso):
<VirtualHost *:80>
...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
...
</VirtualHost>
IIS
Installa il modulo IIS Url-Rewrite, utilizzando la GUI di configurazione aggiungi queste impostazioni:
<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>
Leggi di più qui
RewriteCond %{HTTP:X-Forwarded-Proto} !(https|^$)
Le soluzioni htaccess precedenti hanno causato il fallimento del controllo di integrità ELB. Ho avuto qualche problema a trovare la soluzione finché non ho scoperto un articolo online in cui qualcuno aveva gli stessi problemi che avevo io. La sua soluzione è stata quella di aggiungere questo all'inizio del file htaccess invece:
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Per consentire questa e altre richieste locali su HTTP durante il reindirizzamento di richieste esterne tramite ELB a HTTPS, regola la condizione di riscrittura in modo che corrisponda su http anziché su una corrispondenza negativa su https.
Potrebbe non essere la soluzione che potresti cercare, ma un'altra opzione potrebbe essere quella di utilizzare AWS CloudFront oltre a ELB. CloudFront offre la possibilità di reindirizzare tutto il traffico HTTP in entrata su HTTPS.
Ho avuto uno strano problema con la configurazione di nginx e ELB. La mia configurazione includeva 3 diversi servizi all'interno di un nginx dietro ELB. E ho avuto un problema di contenuto misto: quando la tua richiesta a ELB è https, ma solo all'interno di ELB http, e il server crea il percorso relativo a static utilizzando http, quindi il browser non riesce con il problema di "contenuto misto". E devo creare una soluzione per entrambi i lavori http / https senza reindirizzamenti.
Ecco la configurazione situata nella nginx/conf.d/
cartella:
# Required for http/https switching
map $http_x_forwarded_port $switch {
default off;
"80" off;
"443" on;
}
Ciò significa che avremo la conoscenza di cosa sia il protocollo client reale. Come puoi vedere, lo avremo in $switch
var. E in questo momento lo usi in tutte le posizioni in cui ne hai bisogno:
location ~ /softwareapi/index.php {
fastcgi_param HTTPS $switch;
.. other settings here ..
}
Con l'impostazione HTTPS, l'applicazione php rileverà automaticamente il protocollo corretto e costruirà con cura il percorso relativo per prevenire problemi di contenuto misto.
I migliori saluti.
Basato sulla risposta di @ Ulli Se vuoi configurarlo usando Terraform , ecco un esempio>
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"
}
}
}
Crea un file .ebextensions/00_forward_http_to_https.config
con il seguente contenuto:
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"
Assicurati di impostare prima la variabile d'ambiente APP_URL dalla console di gestione AWS.