LINUX.ORG.RU
ФорумAdmin

nginx и регистр доменного имени

 ,


1

4

Здравствуйте.

<?php
echo $_SERVER['HTTP_HOST'];
?>

n@MacBookProX:~$ curl 'http://domain.ru/1.php'
domain.ru
n@MacBookProX:~$ curl 'http://dOmAiN.rU/1.php'
dOmAiN.rU

nginx -v
nginx version: nginx/1.10.0 (Ubuntu)

Однако https://tools.ietf.org/html/rfc4343 говорит 'Domain Name System (DNS) names are «case insensitive».'

И что это за треш?

★★☆☆
Ответ на: комментарий от mandala

Ну так твой хттп заголовок ломается от обращения не по домайннейм а по ип? Не? Ну так вот — обработка домайннейм ни какого отношения к хттп и прочему не имеет.

Как это не имеет? Браузер шлет данные на сервер по протоколу http, где в том числе домен (который браузеры лоукейсят) отправляется в том числе в заголовке Host:

xtraeft ★★☆☆
() автор топика

Короче спроси на стейковерфлоу и получи 100 ответов по сабжу, спроси в рунете и получи 100 ответов почему тебе это не нужно. А еще и макоеб, вот гнида то!

xtraeft ★★☆☆
() автор топика
Ответ на: комментарий от xtraeft

Ты же сам сказал, что если не вносить свою пару IP-домен в таблицу, то браузер будет спокойно пработать не меняя ип на домен.

Ты сам себе противоречишь, игнорируешь документацию, цепляешься к словам, пытаешь провоцировать собеседника, по всей видимости довольно безграмотный и просто меня утомил своей ослиной непробиваемостью. Куда ты там меня посылал? В лолксы? Вот туда и пойду, а ты дальше тут маши руками и брызгай слюной.

mandala ★★★★★
()
Ответ на: комментарий от xtraeft

Веб-сервер подчиняется правилам обработки доменных имен которые прописаны в документации к домайнейммсустем. Всё.

mandala ★★★★★
()
Ответ на: комментарий от xtraeft

Так ведь моя претензия именно к этому поведению!

Мы тут это поняли уже. Ты вот только никак не поймёшь.

Ладно бы ты своё мнение выражал в духе «мне так неудобно, как сделать так, чтобы в нижнем регистре попадало на бекенд?». Нет. Вместо этого ты с пафосом и бравадой объявляешь своё частное мнение единственно верным, размахивая при этом ссылкой на тезисы, которые не только не подтверждают твои слова, а прямо их опровергают. В ответ на претензии к огрехам в суждениях ты либо поливаешь собеседников грязью, либо разыгрываешь карту жертвы.

Это очень эффективный шаблон поведения, если тебе нужно не решать проблему, а просто «доказать», что ты прав. Вынеся дискуссию в эмоциональную плоскость, этого легко добиться, не утруждая себя собственно доказательствами.

Обычно всё вышесказанное выражают так: «Чё ты как баба, ну?»

i-rinat ★★★★★
()

Тред весь не читал, но используйте haproxy))

Там логика такая: какой Host клиент передал, тот и будет отправлен приложению. Но без какого-либо труда поведение можно изменить, например вот так:

http-request set-header Host %[req.hdr(Host),lower]

RiD
()
Ответ на: комментарий от xtraeft

Здрасьте. Если у тебя этот ip не указан в server_name или там вилдкард не стоит, то у тебя 403 откроется, а не что ты там ожидаешь.

Ой, забыл, еще пара слов: вот этот твой комментарий касается твоего хттп. Так вот — кроме хттп существует еще тыща протоколов (да сраный фтп например), и там, сюрпрайз, тоже используется днс.

mandala ★★★★★
()
nslookup linux.org.ru && nslookup Linux.Org.Ru
Server:		192.168.0.254
Address:	192.168.0.254#53

Non-authoritative answer:
Name:	linux.org.ru
Address: 178.248.233.6

Server:		192.168.0.254
Address:	192.168.0.254#53

Non-authoritative answer:
Name:	Linux.Org.Ru
Address: 178.248.233.6

завязывай тупить

novitchok ★★★★★
()
Ответ на: комментарий от xtraeft

Там кстати же галочка в дисковой утилите есть.

расскажи про эту галочку дефолтной заводской установке.

Давайте потыкаем меня теперь в макось заодно.

и мысли не было. Но если у тебя нормально с тем, что в маке фс по дефолту нечувствительна к регистру, то я не понимаю, почему ты так волнуешься за http.

leave ★★★★★
()
Ответ на: комментарий от goingUp

Убиват за такие ссылки, у меня page4!

anonymous
()
Ответ на: комментарий от beastie

Персональные поддомены для юзеров, типичный такой юзкейс, на ЖЖ и диване есть, например, ещё на хабре раньше было.

anonymous
()
Ответ на: комментарий от i-rinat

Безусловно, я погорячился тут, и раздул из мухи слона, не разобравшись в вопросе - это факт.

Дело в том, что когда мне в ответ пишут какие то аргументы вроде «А еще браузер IP поменяет на доменное имя» и тд, у меня сразу начинает гореть в одном месте.

Или «Вот этот домен настоящий домен, а тот домен — это другой домен, для хттп.».

Или «нам нечего сказать по сути вопроса, но вот мы считаем что вордпресс - говно».

xtraeft ★★☆☆
() автор топика
Последнее исправление: xtraeft (всего исправлений: 1)
Ответ на: комментарий от Dark_SavanT

Так ты тоже наверное обладатель lg p500 и можешь рассказать о нем что-то?

xtraeft ★★☆☆
() автор топика
Ответ на: комментарий от anc

Вас в мыле не смущает VaSy.PupKin@VasY.CoM ?

До собаки - не смущает, обрабатывай как хочешь. После собаки - или принять разброд-шатание и обрабатывать как придется (на свое усмотрение), или клиентов заставляй все в лоукейс перегонять.

xtraeft ★★☆☆
() автор топика
Ответ на: комментарий от leave

Потому что я не использую макось как вебсервер, наверное?

xtraeft ★★☆☆
() автор топика
Ответ на: комментарий от i-rinat

Ладно бы ты своё мнение выражал в духе «мне так неудобно, как сделать так, чтобы в нижнем регистре попадало на бекенд?». Нет.

Именно так, но ведь это не только мне неудобно! Вы привели dns0x20 как пример, ну ты правда считаешь что это прямо такой случай, ради которого нужно устраивать все наоборот?
Забей на мою манеру общения - тут я однозначно неправ, но какой в этом всем смысл? Нелогичная система.

xtraeft ★★☆☆
() автор топика
Последнее исправление: xtraeft (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Смотри, у меня вот наглядный вопрос назрел по сабжу (напомню, речь про nginx):

почему в server_name я могу указать linux.org.ru и nginx обработает все запросы, где в Host: linux.org.ru написано в разном регистре (!) И он все эти запросы засунет дальше, но в location он сразу начинает различать регистр, и там образно говоря /Forum/ и /forum/ для него будут двумя разными локейшнами.

xtraeft ★★☆☆
() автор топика
Ответ на: комментарий от i-rinat

что является ложью
Делая замену домена простой текстовой заменой ты ломаешь контент, ты в курсе?

На холодную голову полистал тред и понял, о чем ты говорил.
Да нет, как раз дело в том что я не делаю грубый апдейт в базе вордпресса, а меняю 2 поля (или три, в случае multisite конфига) и все. Я же не гоняю там по всему контенту запросы в бд и не меняю все реплейсом как будто через sed.
Неудачно выразился, надо было учесть что вордпресс тут никто не видел. Да и зачем он тут нужен? Не я его приплел, он к делу отношения не имеет.

xtraeft ★★☆☆
() автор топика
Последнее исправление: xtraeft (всего исправлений: 1)
Ответ на: комментарий от xtraeft

а меняю 2 поля (или три, в случае multisite конфига

Там даже если по какой-то причине не хочется лезть в базу, то можно просто вбить 2 строки в текстовый конфиг. Но лучше ведь не вбивать, а сеять дальше мифы и стереотипы уровня «линукс на десктопе без пересборки ядра не заработает».

xtraeft ★★☆☆
() автор топика
Ответ на: комментарий от xtraeft

но в location он сразу начинает различать регистр, и там образно говоря /Forum/ и /forum/ для него будут двумя разными локейшнами.

Просто path, query и fragment — регистрозависимые, а домен — регистронезависимый.

i-rinat ★★★★★
()
Ответ на: комментарий от xtraeft

dns0x20 как пример, ну ты правда считаешь что это прямо такой случай, ради которого нужно устраивать все наоборот?

RFC на DNS датируется 1987 годом, при этом очевидно собирает в себе и ранние годы. Когда-то были системы, которые просто не имели разного регистра. Так что регистронезависимость — наследие тех времён.

dns0x20 это не причина, он появился лет на 20 позже стандарта, который в свою очередь появился на много лет позже конкретных реализаций. Этот хак никак не может быть причиной чего-то из далёкого прошлого.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Просто path, query и fragment — регистрозависимые, а домен — регистронезависимый.

Так я поэтому тред и создал, правда мое косноязычие и агрессия сыграли против меня.

Просто path, query и fragment — регистрозависимые, а домен — регистронезависимый.

Вот, а почему? Я пошлю http host в разном регистре, почему бы их по общей логике не обработать по разным server_name? nginx их в один завернет!

RFC на DNS датируется 1987 годом, при этом очевидно собирает в себе и ранние годы. Когда-то были системы, которые просто не имели разного регистра. Так что регистронезависимость — наследие тех времён.

Как мы выяснили еще в прошлый раз, днс я зря привлек - вопрос у меня скорее к веб-серверам.

//И если какая-нибудь мандала еще раз тут напишет «это так потому что тут домен такой, а потом он не такой», или «РАБОТАЕТ НЕ ТРОГАЙ, там ип в домен резолвится» - я опять начну вести себя агрессивно и зло (это не оправдание).

Предлагаю вопрос днс отбросить, оставить только http протокол, если это кому то еще интересно :)

xtraeft ★★☆☆
() автор топика
Последнее исправление: xtraeft (всего исправлений: 1)
Ответ на: комментарий от xtraeft

Веб-сервер подчиняется правилам обработки доменных имен которые прописаны в документации к домайнейммсустем. Всё.

Тебе интересно почему так? Ну не знаю, правда. Может быть чтоб не сломалось чего?

mandala ★★★★★
()
Последнее исправление: mandala (всего исправлений: 2)
Ответ на: комментарий от mandala

Веб-сервер подчиняется правилам обработки доменных имен которые прописаны в документации к домайнейммсустем. Всё.

Так ведь не подчиняется. В server_name он домен обрабатывает все что приходит в любом регистре (ХОТЯ, НА МИНУТОЧКУ - регулярки и там можно написать), несмотря на http host.

xtraeft ★★☆☆
() автор топика
Последнее исправление: xtraeft (всего исправлений: 1)
Ответ на: комментарий от xtraeft

Зачем делать неявное преобразование на ровном месте? Будет нужно приложению - оно само в lowercase приведёт. И потратит ровно столько же ресурсов (ведь соответствующие функции PHP/Python/etc всё равно написаны на быстрых языках типа C/C++). Иначе может дойти и до вопросов «фигли nginx не экранирует кавычки и слеши в запросе - а вдруг я запрос без экранирования сразу в SQL вставлю». Это просто не его задача. Его задача отдавать статику + перенаправлять запросы к скриптам соответствующим обработчикам. Эту задачу он выполняет.

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Зачем делать неявное преобразование на ровном месте? Будет нужно приложению - оно само в lowercase приведёт.

Ну окей, а зачем он тогда server_name linux.org.ru и LINUx.ORg.Ru матчит как один хост?

xtraeft ★★☆☆
() автор топика
Ответ на: комментарий от mandala

Тебе интересно почему так? Ну не знаю, правда. Может быть чтоб не сломалось чего?

Ну так раз не знаешь, может в толксы пойдешь? Тебе звездочки набить надо? Давай попросим модератора, я тебе свои отдам.

xtraeft ★★☆☆
() автор топика
Ответ на: комментарий от xtraeft

В плане ресурсов проще на уровне фронтенда перевести все в лоукейс и отправить дальше на бекенд, чем на бекенде это проверять.

С чего ты взял, что на бекэнде дольше преобразовывать регистр, чем на фронтэнде? Как бы даже у скриптовых языков стандартные строковые функции всё равно написаны на C/C++ и поэтому столь же быстры, как и у веб-сервера.

Никто не заставляет тебя преобразовывать регистр каждый раз, когда захочется что-то сравнить. Ты можешь преобразовать регистр доменного имени и сохранить в переменную, а потом использовать её.

KivApple ★★★★★
()
Ответ на: комментарий от xtraeft

Потому что ему так приказано делать стандартом. А что передавать бекэнду стандартом не указано. И тут возникает неоднозначность - преобразовать в верхний регистр, преобразовать в нижний регистр и оставить как есть. «Так принято» в качестве аргумента не канает. Так что оптимальным вариантом является оставить как есть. А уж бекэнд потом вызовет strtolower, если ему оно надо. Или не вызовет, если ему плевать откуда его вызвали.

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Потому что ему так приказано делать стандартом.

Вебсерверу приказано стандартом обрабатывать Host разного регистра как один единый? И зачем?

Ну и вот вы говорите что раз host позволен быть разного регистра, дадите мне зарулить linux.org.ru и Linux.org.ru в разные вхосты? Я навскидку сейчас воткнул в конфиг - не получается без костылей.

Клиенты шлют заголовок как хотят, сервер принимает как хочет. Самому то не смешно?

xtraeft ★★☆☆
() автор топика
Последнее исправление: xtraeft (всего исправлений: 1)
Ответ на: комментарий от KivApple

Потому что ему так приказано делать стандартом. А что передавать бекэнду стандартом не указано. И тут возникает неоднозначность - преобразовать в верхний регистр, преобразовать в нижний регистр и оставить как есть. «Так принято» в качестве аргумента не канает. Так что оптимальным вариантом является оставить как есть.

Хорошо, пусть фронтенд матчит как надо (регулярки то у него там между прочим работают, когда нужно!), а я на бекенде сам разберусь. Ах, я же не могу гарантировать бекенду что к нему дойдет «host: » как изначально планировалось - его или браузер покоряжит, или вебсервер не тот запрос зашлет.

xtraeft ★★☆☆
() автор топика
Ответ на: комментарий от KivApple

Иначе может дойти и до вопросов «фигли nginx не экранирует кавычки и слеши в запросе - а вдруг я запрос без экранирования сразу в SQL вставлю». Это просто не его задача

Передай привет cloudflare, кстати :) Но это оффтоп, как и вордпресс до которого местный модератор бздун докопался.

xtraeft ★★☆☆
() автор топика
Ответ на: комментарий от xtraeft

Потому что по стандарту нет разницы между регистром букв в доменном имени. Причины, вероятно, также же как и у авторов Pascal - нефиг создавать имена, которые отличаются только регистром. Так исторически сложилось и было закреплено стандартом. linux.org.ru и Linux.org.ru - один и тот же домен. Однако, в стандарте не описана процедура нормализации. То есть оба этих доменных имени полностью равноправны и нельзя сказать, что какое-то из них более правильное, чем другое. А значит веб-сервер не имеет право преобразовывать одно в другое. Ведь они равноправны.

Для веб-браузера стандарты немного другие + браузеры часто от них отступают. В любом случае браузер и сервер друг с другом договорятся и сервер отдаст по запросу браузера правильную страницу. Так что эти различия в поведении не страшны.

KivApple ★★★★★
()
Ответ на: комментарий от xtraeft

ngingx гарантирует, что ему дойдёт host так как отправит его браузер или иной клиент. А уж что там делает браузер это совсем другой вопрос. Как бы один и тот же HTML может по-разному в разных браузерах отображаться.

KivApple ★★★★★
()
Ответ на: комментарий от xtraeft

Предлагаю вопрос днс отбросить, оставить только http протокол

Нельзя. Host в URI это и есть доменное имя, которое регистронезависимо, ведь имена разрешаются через DNS. Эти области неразрывно связаны.

i-rinat ★★★★★
()
Ответ на: комментарий от KivApple

Однако, в стандарте не описана процедура нормализации.

Описана же. Но не обязательна.

А значит веб-сервер не имеет право преобразовывать одно в другое. Ведь они равноправны.

Как раз из-за того, что они равноценны, он имеет право преобразовывать так, как ему нравится. В конкретном случае выбрали вариант «не менять». Просто потому что.

i-rinat ★★★★★
()

Вот примерно так, кстати, люди с ума и сходят.
ЭТО ЖЕ ОЧЕНЬ ВАЖНО, КАК ВЫ ВСЕ НЕ ПОНИМАЕТЕ!?

thesis ★★★★★
()
Ответ на: комментарий от KivApple

Потому что по стандарту нет разницы между регистром букв в доменном имени.

Я правильно понимаю: мы принимаем на входе хост в любом регистре и матчим его в один сервернейм в лоукейс, но ПОТОМ мы почему то этот хост передаем как он пришел? И почему такое поведение нелогичное?

linux.org.ru и Linux.org.ru - один и тот же домен.

В днс да. Но мы вроде тут хотели про http поговорить.

Вот представь ты получаешь данные через пайп в переменную, где все сводишь к лоукейсу, и LOR и lor, все в одну переменную льешь. А потом когда отдаешь дальше - восстанавливаешь зачем то регистр того, что пришло. Это что, логичное поведение?

xtraeft ★★☆☆
() автор топика
Последнее исправление: xtraeft (всего исправлений: 1)
Ответ на: комментарий от KivApple

ngingx гарантирует, что ему дойдёт host так как отправит его браузер или иной клиент. А уж что там делает браузер это совсем другой вопрос. Как бы один и тот же HTML может по-разному в разных браузерах отображаться.

Я в сотый раз спрошу - раз nginx так уважает мой host, какого хера он скипает его регистр КОГДА ЕМУ ЭТО НУЖНО?

xtraeft ★★☆☆
() автор топика
Ответ на: комментарий от i-rinat

Нельзя. Host в URI это и есть доменное имя, которое регистронезависимо, ведь имена разрешаются через DNS. Эти области неразрывно связаны.

Что значит нельзя? http запрос с заголовком Host ты можешь отправить без всякого днс на ип вебсервера.
Вот так даже проще будет обсуждать - представим, что никакого днс нет, а у нас какие то абстрактные клиенты шлют http запросы с host в разных регистрах. Как мы на уровне вебсервера определим, хочет ли клиент, приславший LiNUx.org.ru, получить вхост отличный от linux.org.ru, или нет? Полагаю, что никак, поэтому вебсервер матчит все в один вхост и дальше уже распределяет.
Ну так и на какой хер нужны разные регистры в этом заголовке, если nginx забивает на этот регистр? Я повторюсь, сейчас сделал два вхоста в разных регистрах - все равно он лоукейсит.

xtraeft ★★☆☆
() автор топика
Ответ на: комментарий от mandala

Ты наверное бот эдика - твои комментарии можно впихивать в любой тред техраздела и набивать скор без проблем. Вроде написал в тему, а вроде и ничего по сути.

xtraeft ★★☆☆
() автор топика
Ответ на: комментарий от thesis

ЭТО ЖЕ ОЧЕНЬ ВАЖНО, КАК ВЫ ВСЕ НЕ ПОНИМАЕТЕ!?

Может вместе поищем треды на лоре про http2? Мой вопрос - мелочь по сравнению с этим.
Мой вопрос обусловлен лишь откровенным непониманием в устройстве нынешних вебсерверов - наверняка этому есть какая-то причина, не просто так же придумали такой костылище.

xtraeft ★★☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.