Заголовок 404 против Заголовка 400: ошибка разбора URL

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

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

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

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;, Но каково общее правило? Есть ли в спецификации какие-либо регулярные выражения?


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

Но эта проблема является серьезной в случае с SEO. Как 400 это совсем не то же самое, что 404 в случае позиционирования. И приятно стилизовать 400 страниц по-своему, и сказать кому-то не «страница не найдена», но «вы пытаетесь вставить что-то в мой красивый URL? Это плохой запрос!

3

Решение

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

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]