Я хочу создать правило в nginx, которое делает две вещи:
- Удаляет "www." из запроса URI
- Перенаправляет на «https», если URI запроса - «http»
Существует множество примеров того, как выполнять каждую из этих вещей в отдельности, но я не могу найти решение, которое выполняет обе эти функции правильно (то есть не создает цикл перенаправления и правильно обрабатывает все случаи).
Он должен обрабатывать все эти случаи:
1. http://www.example.com/path
2. https://www.example.com/path
3. http://example.com/path
4. https://example.com/path
Все они должны заканчиваться на https://example.com/path (# 4) без зацикливания. Есть идеи?
Ответы:
Лучший способ сделать это - использовать три серверных блока: один для перенаправления http на https, один для перенаправления http-имени https на no-www, а второй для фактической обработки запросов. Причина использования дополнительных серверных блоков вместо ifs заключается в том, что выбор сервера выполняется с использованием хеш-таблицы и выполняется очень быстро. Использование уровня сервера if означает, что if запускается для каждого запроса, что бесполезно. Кроме того, захват запрошенного URI в перезаписи является расточительным, так как nginx уже имеет эту информацию в переменных $ uri и $ request_uri (без и со строкой запроса, соответственно).
источник
https://example.com/
www.sub.example.com
кsub.example.com
и затем только получить сертификат SSL дляsub.example.com
Теперь я знаю , что проверка сертификата SSL происходит до 301 редиректов, поэтому она не может работать. Более подробное объяснение здесь: serverfault.com/a/358625/144811Это работает для меня:
Имейте в виду, что оба
yourdomain.com
иwww.yourdomain.com
должны быть в вашем SSL-сертификате. Это возможно с подстановочным сертификатом или с альтернативным именем сервера, как описано здесь . Проверьте https://www.startssl.com для хороших и бесплатных сертификатов, которые делают это. ( Edith : начиная с Chrome версии 56, сертификаты StartSL больше не будут доверять. Попробуйте вместо этого https://letsencrypt.org/ .)источник
include
правило для добавления его в оба блока сервера SSL.Проведя так много времени с сотнями подобных случаев, я пришел к следующему фрагменту. Он короткий и легко подстраивается под что угодно.
Да, это может быть. Но оно существует по определенной причине и не должно причинять вреда тем, кто знает, как правильно его использовать. ;)
источник
Я предпочитаю вернуться с кодом ответа, чтобы браузер знал, что вы перенаправляете его на другой URL.
затем другой блок настроек сервера для
https
источник
как насчет создания блока сервера для этой цели:
затем перезапустить nginx
источник
https://www.example.com
кhttps://example.com
а.Я думаю, что это должно работать.
В вашем простом определении HTTP-сервера предлагается что-то вроде anthonysomerset, а именно:
Затем на вашем определении сервера SSL:
Таким образом, перенаправление должно происходить только один раз для каждого запроса, независимо от того, на какой URL-адрес изначально переходит пользователь.
источник
if ($host = 'www.example.com') {
так как ваше регулярное выражение не работает для меня, хотя. Понятия не имею почему, как это выглядит правильно.Вот полный пример, который помог мне. Проблема заключалась в том, что у меня не было сведений о ssl (
ssl_certificate
и т. Д.) В блоке перенаправления www. Не забудьте проверить свои журналы (sudo tail -f /var/log/nginx/error.log
)!источник