Это в основном философский вопрос о лучшем способе интерпретации спецификации 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 в этом случае.)