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