Заголовок 404 и заголовок 400: ошибка синтаксического анализа URL

Я пишу свой собственный маленький фреймворк для PHP. Я хочу написать все настолько семантически, насколько это возможно, и у меня все сложилось.

У меня url разбор class. Он анализирует весь URL-адрес (схему, поддомен, домен, ресурс и запрос). Затем класс router решает, что делать с этим url. Если есть ресурсы, соответствующие url, он "отображает" его, если не отображает 404, если ресурс запрещен, он отображает 403 и т. Д. В чем проблема:

Допустим, мой сайт находится в: http://en.mysite.com. Допустим, страниц asd и &*% не существует. Итак, у меня есть 2 адреса:

http://en.mysite.com/asd
http://en.mysite.com/&*%($^&#

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

http://en.mysite.com/asd // header 404 Page not found
http://en.mysite.com/&*% // header 400 Bad request

Однако (по данным нашего гуру-сайта):

http://stackoverflow.com/<<            // header 404
http://stackoverflow.com/&;:           // header 404
http://stackoverflow.com/&*%($%5E&#    // header 400 (which btw is not styled...)
https://www.google.com/%&*(#$*%&@^     // header 404...

Какое правило? Должна ли каждая система предугадывать, какие символы подходят для URL? Как по мне, url должен содержать только [a-z0-9-_.#!]+. Я использую косые черты в качестве параметров, поэтому мне не нужно ? = &amp;. Но каково общее правило? Есть ли в спецификации регулярное выражение url?


Кстати: для тех, кто скажет, поставьте 404 и пейте медведь: наверное, буду :).

Но это серьезная проблема в случае SEO. Поскольку 400 - это совсем не то же самое, что 404 в случае позиционирования. И приятно оформить 400 страниц по-своему и сказать кому-то не «страница не найдена», а «вы пытаетесь вставить что-то в мой красивый URL-адрес? Это ПЛОХОЙ ЗАПРОС !


person Jacek Kowalewski    schedule 22.07.2015    source источник
comment
Вам решать, что ваша система сочтет плохой. В RFC2616 нет ничего особенного. . Но вы можете использовать RFC3986, чтобы проанализировать, правильно ли сформирован URL-адрес.   -  person Inceddy    schedule 22.07.2015
comment
Спасибо за ответ и прямую ссылку на w3.org. В соответствии с этим на самом деле все остается на сервере ... Но вот это предложение интересно: 400: Клиент НЕ ДОЛЖЕН повторять запрос без изменений. Означает ли это, что в современных браузерах этот заголовок кэшируется на стороне браузера, и все будущие запросы даже не отправляются? Немного не по теме, но, может быть, в этом случае 404 лучше ... BR!   -  person Jacek Kowalewski    schedule 22.07.2015
comment
да. Но это НЕ ДОЛЖНО НЕ ДОЛЖНО, так что кто знает ^^   -  person Inceddy    schedule 22.07.2015


Ответы (1)


Насколько я могу судить по RFC2616 IETF, для запросов, которые имеют малую форму (т. е. не соответствуют IETF RFC3986, тогда как 404 следует возвращать для ресурсов, которые не существуют (410 следует возвращать для ресурсов, которые когда-то существовали, но теперь исчезли).

В приведенных выше примерах URL-адреса со знаком%, за которым не следуют два шестнадцатеричных символа, определенно имеют небольшой формат (например, en.mysite.com/&%($^&# и www.google.com/%&(#$*%&@^). Также неверно сформированы запросы, в последней части которых есть два ? (знак вопроса).

Регулярное выражение для URL-адресов можно найти в ответ на вопрос: Проверка PHP / регулярное выражение для URL.

person joosts    schedule 22.07.2015
comment
Спасибо за Ваш ответ. Думаю, это развеивает все мои сомнения. Если вы не возражаете, я немного подожду с нажатием кнопки «Принять», может, кто-то сейчас создает энциклопедический ответ :). +1 от меня. - person Jacek Kowalewski; 22.07.2015