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».'

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

★★☆☆

Domain Name System (DNS) names are «case insensitive».

Это означает, что domain.ru и dOmAiN.rU это один и тот же домен, а не что тебе нгинкс обязан привести его к нижнему регистру.

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

Это означает, что domain.ru и dOmAiN.rU это один и тот же домен, а не что тебе нгинкс обязан привести его к нижнему регистру.

Т.е. это не баг, а фича веб сервера? Окей, допустим. Но это ведь ненормальное поведение и никаких опций я не нашел чтобы исправить эту ситуацию.

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

Но это ведь ненормальное поведение

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

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

У меня нет апача под рукой проверить, он так же себя ведет?

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

Давай ты эти фантазии выбросишь и расскажешь кому то другому?

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

Ладно, давайте я задам вопрос иначе: где то в рфц описано что имя хоста может иметь разный регистр?

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

У меня нет апача под рукой проверить, он так же себя ведет?

Не знаю. Если в rfc не написано, что http клиент должен преобразовывать домен в нижний регистр, и что веб-сервер имеет право проводить какие-то манипуляции с заголовком host перед отсылкой в php, то это единственно возможное по стандарту поведение.

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

Там много чего не написано, но это не значит что можно устраивать треш и содомию и везти себя как нелогичное безобразие.

curl -v gOOgle.com

> Host: gOOgle.com
> User-Agent: curl/7.51.0
> Accept: */*

Ну хорошо, похоже меня одного этот вопрос волнует.

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

Так тебе нечего по сути вопроса сказать, может поутверждаешься в другом месте? Меня этот вопрос сильно волнует, опции в конфиге чтобы это пофиксить нету.

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

где то в рфц описано что имя хоста может иметь разный регистр

RFC 3986 и не только для доменных имён, но и для любых URI (включая email и т.д.).

PS: это значит, что 'ExAmplE.cOm' == 'example.com' и в чачтности что 'John.Doe@Example.com' == 'john.doe@example.com'

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

где то в рфц описано что имя хоста может иметь разный регистр?

Где в рфц написано какой именно должен быть регистр?

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

Я сказал по сути вопроса, что это нормальное поведение. Если кто-то не умеет в логику — я не виноват.

server {
      server_name domain.com;
      location / {
        add_header host domain.com always;
      }
}

не проверял

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

Меня этот вопрос сильно волнует, опции в конфиге чтобы это пофиксить нету.

Нет, тебя оно не волнует, ты просто не разобравшись в вопросе лезешь в бутылку.

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

Какой аргумент ты хочешь услышать?

RFC тебе привели? Привели (да и сам ты указывал).

Так если разницы в регистре нет, то с какого перепугу nginx должен тебе что-то неявно менять. Как он Host шапку получил — так и передаёт дальше. И это правильно.

А для упоротых (и неумеющих гуглить) быдлокодеров, не совоиших strcasecmp вот: https://dodwell.us/rewrite-uri-to-lowercase-using-nginxperl-nginxlua-or-apach...

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

Так если разницы в регистре нет, то с какого перепугу nginx должен тебе что-то неявно менять. Как он Host шапку получил — так и передаёт дальше. И это правильно.

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

А для упоротых (и неумеющих гуглить) быдлокодеров

Конечно, как же без оскорблений.

не совоиших strcasecmp вот: https://dodwell.us/rewrite-uri-to-lowercase-using-nginxperl-nginxlua-or-apach...

Ага, давайте вместо того чтоб приводить все $host к lowercase будем писать рерайты, ресурсы же девать некуда.

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

А ты можешь привести хотя бы один пример, когда разный регистр в доменном имени был бы нужен? Это ведь не та часть uri, где имя файла или аргументы, это домен! Зачем там регистр?

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

Хотя что говорить, я помню как то тут создал голосование про www. сабдомен, так все поддержали этот атавизм. Утята, иначе и не назвать.

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

привести хотя бы один пример, когда разный регистр в доменном имени был нужен

В доменных именах регистра НЕТ. Точка. 'A' и 'a' — это один и тотже символ. Как тебе это ещё объяснить?

вместо того чтоб приводить все $host к lowercase

Неявные преобразования — зло. Это должно быть или описано в rfc или не делаться. (Что nginx и не делает и это правильно).

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

И поэтому оно case insensitive. И смотри мой предыдущий комент

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

Что nginx и не делает и это правильно

А вот браузеры делают. Проверил в FF. Но они много всякого делают, чего с них взять.

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

Ага, браузеры делают, но по своему усмотрению.
А бекенды со своей стороны тоже делают по своему усмотрению.

Я принял этот факт и смирился, у меня один вопрос - ЗАЧЕМ? Кому это нужно?

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

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

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

А для упоротых (и неумеющих гуглить) быдлокодеров, не совоиших strcasecmp вот: https://dodwell.us/rewrite-uri-to-lowercase-using-nginxperl-nginxlua-or-apach...

Кстати, быдлоклоун, ты оверхед на это все посчитаешь?
Хотя можешь удалить просто с -100, ты же модератор, можно говном кидаться.

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

Это нужно только каким-то наркоманам. Построй логический ряд.

Условие: FOO == foo

Действие: curl http://FOO/

Как отрабатывает вебсервер: set_header Host FOO; send_response Host;

Что требуешь ты: var $host = lowercase(FOO); set_header Host $host; send_response Host;

Вопрос, зачем нам нужен второй алогритм, если FOO == foo, то есть FOO == lowercase(FOO), то есть мы просто проводим лишнюю операцию?

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

В доменных именах регистра НЕТ. Точка. 'A' и 'a' — это один и тотже символ. Как тебе это ещё объяснить?

Ага, то есть примеров нет. На уровне днс у нас значит регистр не важен, а когда мы запрос шлем на веб сервер, там регистр сразу становится важен. Давайте переложим на бекенд все эти вопросы, а клиенты пусть у нас генерят запросы вида google.ru, Google.ru, goOgle.ru, gOoGle.ru и тд.
Зачем нам отсекать это все на фронтенде, давайте это все передавать дальше! У нас ведь видимо есть столько интересных ситуаций, когда регистр в доменном имени что-то значит (на самом деле ни одной)!

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

Что требуешь ты: var $host = lowercase(FOO); set_header Host $host; send_response Host;

Да, я требую на уровне http протокола переводить все домены в лоукейс. Я хочу логики, я не хочу этого треша который есть сейчас. Не нравится? Хорошо, тогда выкиньте нахер тот rfc и дайте мне возможность регистировать case sensitivity домены.

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

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

PS пишу с LINUX.org.ru

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

У меня нет претензий к rfc, я наверное и ссылку в стартовом посте зря упомянул сгоряча (посмотрел тут на бекенд и мягко говоря охерел).

Однако я считаю что это поведение нелогично и как минимум, как минимум, должно хотя бы иметь для этого строчку в конфиге.

Я очень удивлен, что этого до сих пор нет в таком прекрасном веб сервере как nginx (хотя выше тут какой то звездочный персонаж писал что nginx сложен и нефункционален).
Я считаю, что логичнее решать этот вопрос на уровне веб сервера, а не перекладывать это на приложение. Это же будет банально быстрее. И уж точно не надо костылять рерайтами, как предложил местный бздун-модератор, не обдумав вопрос.

P.S. Да, я в стартовом посте неправ - упомянул rfc. Мне сгоряча показалось что эта логика переносится и на http - ошибся.

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

Вопрос, зачем нам нужен второй алогритм, если FOO == foo, то есть FOO == lowercase(FOO), то есть мы просто проводим лишнюю операцию?

Ну да, чего бы нам не перевести переменную в нижний регистр (при наличии опции в конфиге), это ж такие ресурсы потратим на лишней операции. Мы ее лучше пошлем дальше, а там хоть трава не расти.

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

Вопрос: зачем бекенду вообще знать, с каким именем хоста к нему обратились? Разрулить, что идёт куда — задача load-balancer'а (в данном случае nginx), а бекенд — делает сои бекендные вещи.

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

дайте мне возможность регистировать case sensitivity домены

Зачем? Обрисуй конкретный use-case в котором у тебя проблема.

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

Вопрос: зачем бекенду вообще знать, с каким именем хоста к нему обратились?

Ты пьяный что ли? Или ты правда считаешь что у веб приложения не должно быть способа получить переменные из $_SERVER ?

Разрулить, что идёт куда — задача load-balancer'а (в данном случае nginx).

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

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

Я очень удивлен, что этого до сих пор нет в таком прекрасном веб сервере как nginx

Сколько лет Web'у? Около 25-и? Ты первый, у кого с этим проблема. Задумайся.

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

Зачем? Обрисуй конкретный use-case в котором у тебя проблема.

Затем что у меня приходится обрабатывать регистр $host на уровне приложения, а не на уровне веб сервера.
Это ненормально. Да блин, неужели сложно строчку в конфиг добавить?

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

Сколько лет Web'у? Около 25-и? Ты первый, у кого с этим проблема. Задумайся.

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

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

у тебя есть хотя бы один пример случая, где бы регистр в доменном имени был нужен?

Wordpress. Не знаю, как там сейчас с этим дела, а раньше если поменять регистр, его ломало и он мог уйти в цикличный редирект.

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

обрабатывать регистр $host на уровне приложения, а не на уровне веб сервера. Это ненормально.

Вот именно — это не нормально. Зачем тебе обрататывать $host на уровне приложения? Какой в этом сокральный смысл?

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

у тебя есть хотя бы один пример случая, где бы регистр в доменном имени был нужен?

Это вот я от тебя и пытаюсь добиться. Тебе уже тыщу раз сказали, что «Host» case-insensitive, а ты опять в сою дуду.

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

Вот смотри, у тебя возникло упоротое предложение разрулить все рерайтами: но если бы я хотел, я бы и сам это все реализовал ими (можно и гланды через жопу удалять). Ладно, рерайты не нравятся, давай я на уровне приложения это решу.

Но какого хера на довольно логичный и адекватный мой вопрос сразу возникла агрессия - НЕ НУЖНО КОКОКО. Что не нужно то, опцию добавить не нужно? Допустить ситуацию, где это правда надо?

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

Ну и да, если я начну оскорблять тебя (так же как ты это сделал первый), ты потом потрешь мои посты и тред будет поломан.

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

Wordpress.

Welcome to the world of pain. Там всё очень плохо. Там даже все внутенние ссылки с FQDN в DB.

Перетаскивать WP с домена на домен (или даже просто сменить http на https) — задача не тривиальная и требует много sed-fu над дампом DB.

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

сокральный

не, ты точно тупой. Извини :)

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

Ну так да, я то наоборот считаю, что авторы подобного кода наркоманы, и писать код, который зависит от хостнейма ХОТЬ КАК-НИБУДЬ - это вдоль. А вот автор, по-видимому, такие приложения защищает.

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

Wordpress. Не знаю, как там сейчас с этим дела, а раньше если поменять регистр, его ломало и он мог уйти в цикличный редирект.
Не знаю, как там сейчас с этим дела

Так раз не знаешь, то и не пиши. Я его юзаю почти с первых версий. Раньше не проверял, но сейчас все ок.

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

Во первых не оскарбления, а намёк на то, что тебе хочется чего-то очень странного, что за 25 лет существования веба, веб-серверов и прочего ещё никому в голову не приходило.

Я так и не понял суть проблемы.

При разборе полётов все веб-серверы не учитывают регистр. Если тебе так сильно хочется, то простой strtolower всё решает.

От куда ты реврайты припёр — я не знаю.

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

Это вот я от тебя и пытаюсь добиться. Тебе уже тыщу раз сказали, что «Host» case-insensitive, а ты опять в сою дуду.

Т.е. вместо того чтоб резать на фронтенде, придется надеяться что это бекенд посчитает??? На какой хер мне тогда такой фронт.

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

Ты пьяный что ли? Или ты правда считаешь что у веб приложения не должно быть способа получить переменные из $_SERVER ?

получить

Ну так получайте на здоровье! Менять то их зачем? Код и так должен работать.

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