Mixed Content - исправляем с помощью nginx

Уже достаточно давно браузеры помечают сайты, которые работают не по протоколу HTTPS как "не конфиденциальные". Такое уведомление в строке адреса, конечно, неприятно и портит имидж сайта, даже если на самом деле в данном случае никакая конфиденциальность и не нужна. В связи с этим большинство владельцев и вебмастеров озаботились переводом сайтов на работу по безопасному протоколу, но, во многих случаях возникает проблема смешанного контента ("mixed content"). Изначально браузеры только помечали присутствие смешанного контента на странице, но в последстви стали его просто блокировать. Это привело к неправильному отображению страниц - слетала верстка, скрипты и пр.

Чтобы исправить ситуацию, необходимо заменить во всех ссылках на сайте протокол HTTP на HTTPS. Вроде бы не сложное действие, но, как показывает практика, зачастую это становится проблемой. Ссылки могут храниться в базе данных, в файлах стилей , скриптах и шаблонах (это все может быть разбросано по файловой системе) и даже формироваться "на лету". За все разные места могут отвечать разные люди - программисты, верстальщики, СЕО специалисты, СММщики и т.д. Они, как правило, сваливают все друг на друга и проблема остается не решенной или решается очень долго и "дорого".

В этой заметке я покажу как легко, просто и быстро данную проблему решить при помощи HTTP-сервера nginx. Для решения задачи nginx должен быть собран с поддержкой модуля ngx_http_sub_module (для Linux инструкция по сборке по ссылке, для FreeBSD нужно выставить соответствующую галочку в конфгурации в портах). После того как nginx собран с соотвествующим модулем следует очень простая "магия" в конфиге виртуального хоста:

location / {
    sub_filter 'http://' 'https://';
    sub_filter_once off;
}

С помощью этой инструкции nginx подменит все варианты 'http://' на 'https://' в отдаваемых браузеру ответах и проблема смешанного контента будет решена.

Не забываем перечитать конфиг командой:

service nginx reload

и наслаждаемся результатом.