Cloudfront Nginx Rewrite que causa problemas

2

Estoy configurando un cdn usando cloudfront. El origen de mi distribución en la nube es mi balanceador de carga de AWS (ELB). Cuando hago una solicitud a cloudfront en lugar de obtener la URL de cloudfront (cdn.mysite.com/images/image.jpg), se redirige a https://www.alio.com/images/image.jpg . Descubrí por qué está haciendo esto debido a mi nginx.conf:

server {
    root /var/www/html/alio/public;
    index index.php;

    server_tokens off;

    server_name www.alio.com;

    location / {
        if ($http_x_forwarded_proto != 'https') {
            rewrite ^ https://$host$request_uri? permanent;
        }
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

La reescritura ^ https: // $ host $ request_uri? permanente; cambia la URL (cuando elimino la reescritura obtengo la URL cdn). Tengo esta reescritura para asegurarme de que todas las solicitudes a mi sitio sean https. Si hay una manera de hacer en lugar de reescribir un redireccionamiento 301 o no, ¿reescribirlo si detecto que está frente a la nube haciendo la llamada al ELB?

4

¿Ha configurado CloudFront para incluir en la lista blanca los encabezados de host?

Para cada comportamiento> Reenviar encabezados> Seleccione 'Lista blanca'> Seleccione 'Host' de la lista y presione Agregar.

Esta configuración garantiza que el encabezado del host (cdn.mysite.com) se incluya en las solicitudes de regreso al origen (así que asegúrese de haber agregado cdn.mysite.com a su directiva server_name).

También podría valer la pena considerar el uso del encabezado HTTP Strict Transport Security si solo desea que se acceda a su sitio a través de TLS. Agregar lo siguiente a su configuración debería hacerlo:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
0
1

Veo mucho este tipo de construcciones. Son apaquismos que debes aprender a hacer de manera diferente.

Http y https son protocolos y, como tales, deben manejarse en el nivel donde se maneja el protocolo, no donde se maneja la ubicación del documento, a menos que sean específicos de la ubicación, que en su caso no lo son.

Esto también permite mantener las cosas limpias y no configurar inadvertidamente algo en el nivel http que elude la lógica siempre https.

Entonces siempre https es simple:

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

server {
    listen 443 ... ;
    ....
}

No debería hacerlo más complicado :-)