19Jul

Cómo evitar mezclar contenido HTTP y HTTPS cuando no disponemos de certificados para servicios o dominios externos o para todos nuestros subdominios

Cuándo disponemos de un certificado HTTPS para nuestra web, pero esa web depende de otros servicios o recursos externos en los que no tenemos control o simplemente no disponemos de certificado aún siendo nuestros podemos usar nuestra web como Proxy a esos servicios y recursos externos, y estarán bajo el certificado HTTPS de nuestro dominio.

Caso 1 : Los recursos de tipo archivo e imagen son externos

El caso ejemplo es cuando tenemos un frontal el cual es HTTP, pero las imágenes, vídeos u otros recursos están alojados en un servidor cuyo dominio no es HTTPS y no podemos añadir el certificado (o no queremos invertir ese dinero)

En este caso, si tenemos un patrón en la url, por ejemplo un prefijo o contenido podemos crear una norma en la configuración de Nginx para que cuando se acceda por esa sección de la url obtenga el contenido del servicio externo.

Ejemplo:

  • Tenemos nuestra web en un dominio con HTTPS: https://www.dominio1.com
  • Tenemos todas las imágenes en un dominio externo sin HTTPS: http://www.dominio2.com
  • Todas las imágenes y vídeos tienen el prefijo: /images o /videos/ en su ruta

En este caso podemos usar una variación de la siguiente configuración:

nginx.conf

server {

    # ...
    location ~ ^/(images|videos) {
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass http://www.dominio2.com;
    }
    # ...

}

Con esta configuración conseguimos que el recurso:

http://www.dominio2.com/images/sample.jpg

Puede accederse como:

https://www.dominio1.com/images/sample.jpg

Caso 2 : Tenemos una web como servicio externo

Un ejemplo de este caso sería un servidor que tuviésemos por ejemplo para gestionar los comentarios de las entradas de nuestra web, que tiene su Backoffice, recursos Javascript, urls, etc… y usemos los servicios dentro de nuestras entradas de blog.

En este caso podemos crear una «carpeta» para estos servicios y reescribir las direcciones url del proxy para que de forma transparente sean recibidas por el servicio externo.

Ejemplo:

  • Tenemos nuestra web en un dominio con HTTPS: https://www.dominio1.com
  • Tenemos un gestor de comentarios sin HTTPS en: http://comentarios.dominio2.com
  • Queremos acceder al servicio en el dominio sin HTTPS con https://www.dominio1.com/comentarios

En este caso podemos usar una variación de la siguiente configuración:

nginx.conf

server {

    # ...
    location ~ ^/comentarios {
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        rewrite ^/comentarios(.*) $1 break;
        proxy_pass http://comentarios.dominio2.com;
    }
    # ...

}

Con la línea

rewrite ^/comentarios(.*) $1 break;

Lo que conseguimos es reescribir la url antes de hacer la llamada al servidor http://comentarios.dominio2.com y eliminar esa primera sección de la url: comentarios

Leave a comment