Я хочу переписать все http-запросы на моем веб-сервере, чтобы они были https-запросами, я начал со следующего:
сервер { слушай 80; место нахождения / { переписать ^ (. *) https: //mysite.com$1 постоянный; } ...
Одна проблема заключается в том, что при этом удаляется любая информация о субдомене (например, node1.mysite.com/folder), как я могу переписать вышеприведенное, чтобы перенаправить все на https и сохранить субдомен?
Ответы:
Правильный путь в новых версиях nginx
Оказалось, что мой первый ответ на этот вопрос был верным в определенное время, но это превратилось в еще одну ловушку - чтобы оставаться в курсе, пожалуйста, проверьте налоговые переписать ловушки
Я был исправлен многими пользователями SE, так что заслуга им, но что более важно, вот правильный код:
источник
$host
вместо,$server_name
если вы используете поддоменов.ПРИМЕЧАНИЕ. Лучший способ сделать это был предоставлен https://serverfault.com/a/401632/3641 - но повторяется здесь:
В простейшем случае ваш хост будет зафиксирован как сервис, на который вы хотите их отправлять - это сделает перенаправление 301 в браузер, и URL браузера будет соответственно обновлен.
Ниже приведен предыдущий ответ, который неэффективен из-за регулярных выражений, простой 301 отлично подходит, как показывает @kmindi
Я использовал nginx 0.8.39 и выше, и использовал следующее:
Посылает постоянное перенаправление клиенту.
источник
Я думаю, что лучшим и единственным способом должно быть использование перенаправления HTTP 301 Moved Permanently, например:
HTTP 301 Moved постоянно перенаправлять также является наиболее эффективным , так как не существует регулярное выражение для оценки, в соответствии с уже упомянутым pitfails .
Новый HTTP 308 Moved Permanently сохраняет метод Request и поддерживается основными браузерами . Например, при использовании
308
предотвращает браузеры от изменения методы запроса отPOST
кGET
для запроса перенаправления.Если вы хотите сохранить имя хоста и поддомен, это путь.
Это все еще работает, если у вас нет DNS , так как я также использую его локально. Я запрашиваю, например, с
http://192.168.0.100/index.php
и будет перенаправлен точноhttps://192.168.0.100/index.php
.Я использую
listen [::]:80
на своем хосте, потому что яbindv6only
установил наfalse
, поэтому он также привязывается к сокету ipv4. измените его на,listen 80
если вы не хотите IPv6 или хотите связать в другом месте.Решение от Saif Bechan использует то,
server_name
что в моем случае является localhost, но оно недоступно по сети.Решение от Майкла Нила это хорошо, но, в соответствии с пит-фалами, есть лучшее решение с редиректом 301;)
источник
В блоке сервера вы также можете сделать следующее:
источник
Вышесказанное не работает с новыми поддоменами, которые создаются постоянно. например, AAA.example.com BBB.example.com для около 30 поддоменов.
Наконец получил конфиг, работающий со следующим:
источник
301 https://*/
либо отменит запрос преждевременно в других ответах здесь.server_name _;
с$host
был ответ, который добился цели. +1_
его фактическим доменом, например, у.domain.com
меня было два сервера, и nginx случайно перенаправил один из моих серверов на сервер по умолчанию.Я написал комментарий к правильному ответу давным-давно с очень важной поправкой, но я чувствую, что необходимо выделить эту поправку в своем собственном ответе. Ни один из предыдущих ответов не является безопасным для использования, если в какой-то момент вы настроили небезопасный HTTP и ожидали пользовательского контента, имели формы, размещали API или настроили какой-либо веб-сайт, инструмент, приложение или утилиту для общения с вашим сайтом.
Проблема возникает, когда
POST
на ваш сервер сделан запрос. Если ответ сервера с простым30x
перенаправлением, содержимое POST будет потеряно. Что происходит, что браузер / клиент обновит запрос на SSL , но понижаетPOST
кGET
запросу. ЭтиPOST
параметры будут потеряны и некорректный будет сделан запрос на сервер.Решение простое. Вам нужно использовать
HTTP 1.1 307
редирект. Это подробно описано в RFC 7231 S6.4.7:Решение, адаптированное из принятого решения, заключается в использовании
307
в вашем коде перенаправления:источник
Мне удалось сделать это так:
https://stackoverflow.com/a/36777526/6076984
источник
Я запускаю ngnix за AWS ELB. ELB разговаривает с ngnix через http. Поскольку ELB не имеет возможности отправлять перенаправления клиентам, я проверяю заголовок X-Forwarded-Proto и перенаправляю:
источник
Если вы
return 301 https://$host$request_uri;
используете ответ по умолчанию для порта 80, то ваш сервер может рано или поздно попасть в список открытых прокси-серверов [1] и начать злоупотреблять отправкой трафика в другие места в Интернете. Если ваши журналы заполнены сообщениями вроде этого, то вы знаете, что это случилось с вами:Проблема в том, что
$host
будет возвращаться то, что браузер отправляет вHost
заголовке, или даже имя хоста из строки открытия HTTP, например:Из-за этой проблемы некоторые другие ответы здесь рекомендуют использовать
$server_name
вместо$host
.$server_name
всегда оценивает то, что вы положили вserver_name
декларации. Но если у вас есть несколько поддоменов или вы используете подстановочный знак, это не сработает, поскольку$server_name
использует только первую запись послеserver_name
объявления и, что более важно, просто отобразит подстановочный знак (не раскрывая его).Так как же поддерживать несколько доменов при сохранении безопасности? В моих собственных системах я столкнулся с этой дилеммой, сначала перечислив
default_server
блок, который не использует$host
, а затем перечислив блок подстановочных знаков, который делает:(Вы также можете перечислить более одного домена во втором блоке.)
С этой комбинацией несопоставленные домены будут перенаправлены куда-то жестко (всегда
example.com
), а домены, которые соответствуют вашим собственным, попадут в нужное место. Ваш сервер не будет полезен в качестве открытого прокси, поэтому вы не будете привлекать неприятности.Если вы чувствуете себя раздраженным, я полагаю, вы могли бы сделать так, чтобы
default_server
блок соответствовал ни одному из ваших законных доменов и служил чему-то оскорбительному. , , ,[1] Технически «прокси» - неправильное слово, потому что ваш сервер не работает и не выполняет запросы клиентов, просто отправляет перенаправление, но я не уверен, какое слово будет правильным. Я также не уверен, какова цель, но она наполняет ваши журналы шумом и потребляет ваш процессор и пропускную способность, так что вы могли бы также положить этому конец.
источник
Похоже, никто не понял это на 100% правильно. Чтобы запросы порта 80 перешли к своим 443 эквивалентам для всего веб-сервера, вам нужно использовать директиву listen , а не директиву server_name, чтобы указать имя перехвата . Смотрите также https://nginx.org/en/docs/http/request_processing.html.
И убедитесь, что вы проверите, что уже находится в /etc/nginx/conf.d/, потому что чаще всего у меня возникали проблемы, когда default.conf возвращал некоторый существующий vhost. Мой порядок работы с проблемами nginx всегда начинается с перемещения файла по умолчанию, построчно комментируя его, построчно, чтобы увидеть, где он идет не так.
источник
источник