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

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; однако эта безусловная перезапись приводит к циклу перенаправления. Помощь по-прежнему приветствуется.

решение1

Более чистый способ будет таким:

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постоянного, чтобы не расстраиваться, когда вы обнаружите, что исправили ошибку час назад, но изменения не отобразились в вашем браузере :)

решение2

Вам это даже не нужно, так как вы можете просто заставить весь 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

Связанный контент