Назад | Перейти на главную страницу

Nginx: переписываем https: // на http: //

Я пытаюсь заставить Nginx переписывать входящие запросы на сайт моего сервера с префиксом https:// к http:// (это связано с тем, что CMS, используемая на этом сайте, использует URI вместо относительных путей - по сути, нарушая работу всего сайта, делая изображения, скрипты и таблицы стилей недоступными).

В настоящее время я пытаюсь модифицировать существующую директиву, введенную предшественником, но я ограничен в своих знаниях синтаксиса конфигурации Nginx. Вот код:

if ($ssl_protocol = "") {
    rewrite ^   https://$http_host$request_uri? permanent;
}

В настоящее время я закомментировал этот код, чтобы предотвратить насильственную перезапись http:// к https://, но я не могу повернуть процесс вспять, не взломав сайт. Вот что я пробовал до сих пор:

if ($ssl_protocol = "https") {
    rewrite ^   http://$http_host$request_uri? permanent;
}

и

# also tried ($ssl_protocol != "")
if (!($ssl_protocol = "")) {
    rewrite ^   http://$http_host$request_uri? permanent;
}

Первый, похоже, не действует. HTML-код, отправленный клиенту, по-прежнему отправляет HTTPS-запросы, которые не перезаписываются.

Второй фрагмент, похоже, тоже не имеет никакого эффекта - если я правильно понимаю (хотя я все еще несколько удивлен), Nginx не поддерживает логическое отрицание.

Каким будет лучший способ (или рабочий способ) сделать это?

РЕДАКТИРОВАТЬ: Я пробовал добавить код из ответа @NathanC; однако эта безусловная перезапись вызывает цикл перенаправления. Помощь по-прежнему приветствуется.

Более чистый способ:

if ( $scheme = "https" ) {
    return 301 http://example.com$request_uri

или где-то между этим и ответом Натана, где ваш блок ssl-сервера по умолчанию содержит просто return 301 (какой бы ssl-блок ни был, вам нужно внимательно посмотреть на свой, чтобы увидеть, как он реализован и адаптирован) Нет смысла делать регулярное выражение для простого перенаправления

return - http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

изменить: я только что заметил, что есть переменная $https который можно использовать вместо этого в инструкции if. Возврат " " если не https:

if ( $https = "on" ) {
    ...

Помните, что при тестировании изменений вы должны использовать 302 временное перенаправление вместо 301 постоянный, чтобы не выдергивать волосы, когда вы обнаружите, что исправили его на час раньше, но изменения не отразились в вашем браузере :)

Вам это даже не нужно, так как вы можете просто заставить весь https-трафик перейти на http вот так:

server {
        listen 443;
        ssl on;
        server_name example.com;
        rewrite ^(.*) http://example.com$1 permanent;
 }

Ссылка: https://stackoverflow.com/questions/3470290/nginx-redirect-https-to-http