Почему «http://dd» является действительным URL? - PullRequest
1 голос
/ 28 октября 2009

Я пишу приложение .NET 3.5 и использую URI.IsWellFormedUriString(string uriString, UriKind uriKind) для проверки введенных пользователем URI; используя UriKind.Absolute. Я просто играл с приложением, и я немного обеспокоен и смущен, почему что-то вроде:

http://ddd

является действительным URI? Что дает? Я знаю, что это потому, что это часть RFC, но почему он действителен в первую очередь?

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

http://companyinet

или

http://localhost (что очень популярно, но также и особый случай)

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

Есть идеи или мысли? Спасибо.

Ответы [ 6 ]

20 голосов
/ 28 октября 2009

допустимо, потому что оно указывает на уникальный ресурс. В этом случае он указывает на веб-сервер (надеюсь) компьютера 'ddd' в локальной сети.

URI - это уникальный идентификатор ресурса, а не уникальный идентификатор ресурса во всемирной сети. file: ///blah.txt также является допустимым URI

16 голосов
/ 28 октября 2009

Это потому, что это совершенно правильный URI, как вы упоминаете.

Я бы немного изменил вашу стратегию ... Если вы хотите, чтобы URI были не только действительными (как в правильно сформированном), но и действительными, в том смысле, что они фактически указывают на сайт, вам придется добавьте еще один шаг.

После проверки строки выполните запрос HEAD для проверки связи с URL-адресом. Если он возвращает код состояния 2xy, вы, вероятно, можете идти. Это будет работать в большинстве ситуаций, но не без предостережений и исключений.

6 голосов
/ 28 октября 2009

Поскольку он соответствует RFC 1738 (а также спецификации URI RFC 2396 ).

RFC делает специальные допуски для путей ресурсов, которые состоят только из схемы и конкретного элемента схемы - в данном случае имя хоста. Пока он идентифицирует уникальные ресурсы и соответствует синтаксису URI, он действителен.

3 голосов
/ 28 октября 2009

Вы сами ответили на вопрос. Это «правильный» (правильно сформированный) URI по определению спецификации RFC ipso facto.

Чтобы помочь решить требуемую задачу, выполните дополнительные проверки в своем регулярном выражении для одной или нескольких точек (не забудьте убежать от них!) Или, возможно, попытайтесь поразить сам ресурс, чтобы увидеть, действительно ли он отвечает. *

2 голосов
/ 28 октября 2009

Это действительный URI, потому что он соответствует синтаксису URI: у него есть схема и специфичный для схемы компонент («http» - это схема »,«: «разделяя два, и« // ddd » специфичная для схемы часть.)

В случае HTTP URI он также соответствует синтаксису для тех, где 'ddd' является допустимым именем хоста.

Синтаксис URI определен в http://www.ietf.org/rfc/rfc2396.txt

1 голос
/ 29 октября 2009

Вот простой эксперимент, чтобы понять, почему этот URL действителен:

0) используйте утилиту dig или ping, чтобы получить IP-адрес google.com. Я получил: 74.125.53.100

1) Отредактируйте файл / etc / hosts (в Windows это что-то вроде C: \ Windows \ system32 \ drivers \ etc \ hosts, и вам может потребоваться его создать). В вашем файле hosts добавьте строку, подобную этой:

74.125.53.100 ддд

Не забудьте сохранить свои правки.

2) В веб-браузере перейдите по этому адресу: http://ddd

3) Вы только что зашли на Google по URL. Вот почему это действительный URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...