404 против 403 при отсутствии индекса каталога - PullRequest
8 голосов
/ 22 февраля 2011

Это в основном философский вопрос о лучшем способе интерпретации спецификации HTTP. Должен ли каталог без индекса каталога (например, index.html) возвращать 404 или 403? (403 по умолчанию в Apache.)

Например, предположим, что следующие URL существуют и доступны:

http://example.com/files/file_1/
http://example.com/files/file_2/

Но там ничего нет:

http://example.com/files/

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

Я думаю, что следует учитывать несколько вещей:

  • По умолчанию Apache возвращает 403 в этом сценарии. Это важно для меня. Они подумали об этом и решили использовать 403.
  • Согласно W3C, 403 означает «Сервер понял запрос, но отказывается его выполнить». Я предполагаю, что вы должны вернуть 403, если URL имеет смысл, но тем не менее запрещен.
  • 403 может привести к раскрытию информации, если клиент правильно угадает, что URL-адрес соответствует реальному каталогу на диске.
  • http://example.com/files/ не является ресурсом, и тот факт, что он внутренне отображается в каталог, не должен иметь отношения к коду состояния.
  • Если вы интерпретируете схему URL как определение структуры каталогов с точки зрения клиента , внутренняя реализация по-прежнему не имеет значения, но, возможно, внешний вид действительно должен иметь какое-то отношение к кодам состояния. Возможно, даже если вы создали ту же структуру URL без внутреннего использования каталогов, вам все равно следует использовать 403, потому что речь идет о восприятии клиентом структуры каталогов.

В балансе, как вы думаете, что является лучшим подходом? Должны ли мы просто сказать «ресурс - это ресурс, а если его нет, то это 404?» Или мы должны сказать: «если он имеет косую черту, он выглядит как каталог для клиента, и, следовательно, это 403, если нет индекса?»

Если вы находитесь в лагере 403, думаете ли вы, что вам стоит вернуться к 403, даже если внутренняя реализация не использует каталоги? Предположим, например, что у вас есть динамическое веб-приложение с этим URL: http://example.com/users/joe, которое отображается на некоторый код, который генерирует страницу профиля для Джо. Предполагая, что вы не пишете что-то, в котором перечислены все пользователи, http://example.com/users/ должно вернуть 403? (Многие, если не все веб-фреймворки возвращают 404 в этом случае.)

Ответы [ 2 ]

8 голосов
/ 22 февраля 2011

Первый шаг к ответу - обратиться к RFC 2616: HTTP / 1.1 . В частности, в разделах говорится о 403 Запрещено и 404 Не найдено .

  • 10.4.4 403 Запрещено

Сервер понял запрос, но отказывается его выполнить. Авторизация не поможет и запрос НЕ ДОЛЖЕН повторяться. Если метод запроса не был HEAD и сервер желает сообщить, почему запрос не был выполнен, он ДОЛЖЕН описать причину отказа в объекте. Если сервер не желает предоставлять эту информацию клиенту, вместо него можно использовать код состояния 404 (не найден).

  • 10.4.5 404 Не найдено

Сервер не нашел ничего, соответствующего Request-URI. Не указано, является ли состояние временным или постоянным. Код состояния 410 (Унесенные) СЛЕДУЕТ использовать, если сервер через некоторый внутренне конфигурируемый механизм знает, что старый ресурс постоянно недоступен и не имеет адреса пересылки. Этот код состояния обычно используется, когда сервер не хочет точно указывать, почему запрос был отклонен, или когда другой ответ не применим.

Моя интерпретация этого заключается в том, что 404 - это более общий код ошибки, который просто говорит: «Там ничего нет». 403 говорит: «Там ничего нет, не пытайтесь снова!».

Одна из причин, по которой Apache может возвращать 403 для каталогов без явных файлов индекса, заключается в том, что автоматическая индексация (то есть перечисление всех файлов в ней) отключена (a.k.a «запрещено»). В этом случае высказывание «перечисление всех файлов в этом каталоге запрещено» имеет больше смысла, чем высказывание «нет каталога».

2 голосов
/ 19 февраля 2012

Еще один аргумент, почему 404 предпочтительнее: инструменты Google для веб-мастеров.

Действительно, для 404 Инструмент Google для веб-мастеров отображает реферер (позволяющий очистить плохую ссылку на каталог), тогда как для 403, он не отображается.

...