
Я пытаюсь заставить 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