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

13

Я действительно не заметил этот Redirect (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 access.log:

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 и жить с некоторыми перенаправлениями?

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

Джонатан Гуребо
источник
Я думаю, вам придется уточнить, почему вы хотели бы отключить это. Единственная разумная альтернатива редиректу - ответить 404 /socialв вашем примере.
Хокан Линдквист
Я не хочу его отключать, просто предотврати перенаправление. Я хотел бы, чтобы сервер index.html
выводил
Под «этим» я имел в виду нормальное поведение с перенаправлением с неверного URL на правильный URL. Посмотрите ответ @kasperd, чтобы узнать о некоторых причинах, по которым было бы плохой идеей обслуживать контент, например /social. (Кроме того, как правило, нежелательно показывать один и тот же контент по нескольким URL-адресам.)
Хокан Линдквист,

Ответы:

10

Отправка данных без перенаправления нарушит относительные ссылки. Если 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-файл со ссылкой, по которой можно перейти.

kasperd
источник
Это не отвечает на вопрос. Это верно, что относительные ссылки могут быть нарушены. Но если кто-то хочет доставить контент по пути без конечной косой черты, он может иметь причины для этого, например, когда запрос POST отправляется веб-службе. В веб-сервисах нет относительных ссылок, и перенаправление приведет к потере тела POST.
д - р фу маньчжурской
9

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

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

200_success
источник