Назад | Перейти на главную страницу

Apache2 - 301 Redirect при отсутствии символа «/» в конце каталога в URL-адресе

Я действительно не заметил этого перенаправления (301) при запросе такого URL-адреса без косой черты ("/") в конце: http://server/directory

Сервер ответит заголовком 301 Redirect Permanent с заголовком Location, указывающим на http://server/directory/.

Посмотрите этот живой пример:

Запрос пользователя:

GET /social HTTP/1.1
( http://192.168.1.111/social )

Ответ сервера Apache:

HTTP/1.1 301 Moved Permanently
Location: http://192.168.1.111/social/

Запрос пользователя:

GET /social/ HTTP/1.1
( http://192.168.1.111/social/ )

Ответ сервера Apache:

HTTP/1.1 200 OK

Журнал доступа Apache:

192.168.1.130 - - [05/Apr/2014:22:06:47 +0200] "GET /social HTTP/1.1" 301 558 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"
-
192.168.1.130 - - [05/Apr/2014:22:06:47 +0200] "GET /social/ HTTP/1.1" 200 942 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"

Каталог / social / содержит index.html файл.

Программное обеспечение Apache: Apache/2.2.22 (Ubuntu)
Параметры каталога: Options Indexes FollowSymLinks MultiViews

Итак, мой вопрос: почему apache это делает? И как предотвратить перенаправление и отправить index.html прямо? Клиенты должны отправить два запроса, в чем нет необходимости. И, возможно, некоторые клиенты не разрешают перенаправления и не смогут перейти на сайт без конечной косой черты («/»).

Я не хочу отключать перенаправление. Я не хочу, чтобы сервер отправлял ответ напрямую без перенаправления. Даже при запросе /social.

Разработан ли apache для перенаправления этих запросов? Сервер может просто отправлять данные без перенаправления, верно? Следует ли мне использовать mod_rewrite чтобы предотвратить это? Или другая конфигурация? Или я должен просто позволить этому быть таким и добавить косую черту в конце всех ссылок html и жить с некоторыми перенаправлениями?

Что, вы парни, думаете?

mod_dir добавляет это перенаправление, и вы можете отключить его с помощью DirectorySlash Off директива.

Однако обратите внимание, что отключение перенаправления в конце косой черты может привести к поломке некоторых страниц. Если возвращаемая страница содержит относительные ссылки, то эти URL-адреса будут разрешаться по-другому, если страница обслуживается без косой черты в конце.

Отправка данных без перенаправления приведет к разрыву относительных ссылок. Если http://server/directory содержит file, то полный URL для этого будет http://server/directory/file. Ссылка указана как <a href="file"> укажет на http://server/directory/file если базовый URL http://server/directory/, но если базовый URL был только http://server/directory это будет указывать на http://server/file вместо этого, что не является предполагаемым результатом.

Apache мог создать список каталогов двумя разными способами в зависимости от URL-адреса вместо перенаправления. Однако это не сработало бы, если бы index.html файл в каталоге. Поэтому вместо этого Apache использует подход, который работает в обоих случаях.

Это не новое поведение, десять лет назад Apache вел себя точно так же. Клиенты, которые не могут обрабатывать перенаправление, уже должны были быть исправлены. Но для любых клиентов, которые не могут обрабатывать перенаправление, Apache должен отправлять крошечный файл html со ссылкой, по которой можно перейти.