Слэши на конце URL ов - Мнения разделились: - нужны или нет?

Главные вкладки

Аватар пользователя Logrise Logrise 19 июля 2008 в 10:54

Рекомендуют в нескольких местах не заканчивать URL слэшом в конце при включенном модуле PAth. Т.е. делать www.site.ru/about
В гугле нашел несколько комментов о причинах такой рекомендации, но соображения в разных источниках расходятся. Так что это дает?
Нашел следующий коммент по данной теме, достаточно развернутый, и с совершенно обратной рекомендацией:

Более точным является полное указание URL, заканчивающееся именем файла, например,
http://www.site.ru/img/f/filina_l_h/priroda-7/index.shtml

Если же URL заканчивается именем каталога с явно указанным слэшем '/' в конце, например,
http://www.site.ru/img/f/filina_l_h/priroda-7/
то любой "здравомыслящий" HTTP-сервер, включая наиболее распространенные Апач и Microsoft IIS будет действовать так.

Он "заглянет" в соответствующий каталог ( .../priroda-7/ в данном случае), есть ли там индексный файл. Это файл с именем, зависящим от настройки конкретного сервера, но в большинстве случаев что-то из index.htm , index.html , index.php , index.shtml , index.phtml (в случае Апача) либо default.htm , default.html , default.asp (в случае MS IIS) или что-то подобное. Априори сказать, что это, например, именно index.shtml , невозможно. (для простоты "забудем", что ищется не 1 конкретный файл, а просматривается список).

Если индексный файл есть в каталоге, то именно его содержимое и будет отправлено пользователю (более точно: все сработает так, как будто пользователь явно указал в запросе имя этого файла). Если же индексного файла нет, то сервер, в зависимости от настроек, либо выдаст HTML-страничку, содержащую список файлов/каталогов в запрошенном каталоге, либо пошлет куда подальше (ошибка 403, с текстом вроде Forbidden либо Directory Listing Denied).

Самое любопытное происходит, когда URL заканчивается именем каталога без явного слэша на конце, вроде
http://www.site.ru/img/f/filina_l_h/priroda-7
Апач "поправляет" пользователя: он отвечает на запрос редиректом (статус 301 Moved permanently) на тот же URL, но со слэшем на конце. Мол-дескать, «гарячо любимый лузер, каталох-то такой есть, но ты ж не путай божий дар с иишницей, а файл с каталогом, и ступай-ка сюды...» Броузер у пользователя послушно идет, куда его послали. В результате, он, пользователь, все равно получает ту же страницу, что получил бы, если бы сразу явно указал слэш в конце, но на это уходит не 1 запрос-ответ, а 2 (и, в большинстве практических случаев, не 1 TCP-сеанс, а 2). Проще говоря, все происходит почти в 2 раза медленнее.

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

Примечание. Разумеется, в конце URL, оканчивающегося на конкретное имя файла (а не каталога), конечно же, ставить / не нужно.

Комментарии

Аватар пользователя Shedko Shedko 20 июля 2008 в 3:25

Если при создании материала будете указывать "/" в конце ссылки, то Друпал просто не откроет такую страницу, о чем прямо и пишет - мелким текстом Smile

Если дополнительно поставите модуль global_redirect , то и он будет с ссылки drupal.ru/download/ делать редирект на drupal.ru/download

А причин, честно говоря, незнаю Blush

Аватар пользователя Logrise Logrise 20 июля 2008 в 10:15

Парадокс наверное, но у меня на 6.3 с включенным модулем Path спокойно создаются ссылки и со слешом и без слеша и все они так и отображаются на сайте как созданы. Отсюда и вопрос возник, а как правильно и в чем суть?

Аватар пользователя Shedko Shedko 20 июля 2008 в 19:15

про поиск апача файлов index* это да, но при чем тут это ? Не стоит же забывать что у нас просто нет папки /admin и папки /tracker - это документы, хоть и ведущие в разделы. Наберите /admin/ или /tracker/ будет 301 редирект (permanently - постоянный). У нас же не ищется /admin/index.* а просто запрашивается у друпала страничка /admin

Сколько бы вы не задали масок для pathauto от этого новые папки не появятся на сервере, поэтому думать о патавто как о создании папок - по мне, немного неверно.

Другое дело, что если создать маску для pathauto в виде
тип_документа/заголовок , то у нас появится еще один не предусмотренный документ сайт/тип_документа , но опять без "/"

Аватар пользователя axel axel 22 июля 2008 в 19:33

Если логически взглянуть на это дело, то file/ это всегда ссылка на папку, поскольку символ '/' в файловой системе юникса служит для разделения элементов пути к файлу и если какой-нибудь утилите подсунуть путь /path/to/file/ то она воспримет это как путь от корня файловой системы в папки path, to и наконец в папку file, но не обращение к файлу file (конечно стоит помнить что директории в идеологии файловой системы юникса это тоже файлы, только особые, но в данном контексте этот нюанс можно опустить). Если же слеш в конце не указать, то ситуация обрабатывается по контексту. Если file это таки папка, то например команда вывода листинга (ls) будет сработает одинаково для обоих случаев:

$ ls /tmp
$ ls /tmp/

Поэтому логично полагать, что вебсервер должен реагировать подобным образом. Встретив path/to/file/ вебсервер обязан перейти по цепочке директорий, заглянуть в папку file и поискать индексный файл для этой папки (index.html или что-то иное указанное у него в настройках), либо вывести листинг, если индексного файла нет (или ошибку если так указано в настройках). Если же написано file, то по контексту смотрится - если это именно файл, то он возвращается на запрос, если папка, то действуем как описано выше для папок. Но т.к. для скорости обработки вебсерверы обычно определяют тип файла (mime type) по расширению, а не по содержимому, как это делает операционная система, то удобнее полагать, что файл без расширения - всегда папка.

В апаче с помощью mod_rewrite можно организовать разное поведение на наличие и отсутствие слешей, собственно друпал этим и пользуется, т.к. в нем любые url, со слешем в конце или без оного, если они не имеют явного отображения на файловой системе преобразуются в параметр, а отдается всегда файл index.php.

Если взглянуть на правила .htaccess используемые друпалом:

  # Rewrite URLs of the form 'index.php?q=x'.
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

то видим, что редиректа здесь не происходит. Неважно есть / в конце или нет - проверяется наличие файла и папки с данным именем, если они отсутствуют, то вебсервер возвращает файл index.php с оставшейся частью URL в виде параметра. Другие вебсерверы (например nginx) используют похожие средства.

Т.е. получаем, что друпалу в принципе пофиг есть слеши в конце или нет - их установка исключительно дело эстетики.

Аватар пользователя Kation Kation 1 апреля 2012 в 15:05

а как сделать переадресацию с адреса без слеша со слешем на конце не через .htaccess? через глобал редирект это как-то возможно?

Аватар пользователя Kation Kation 11 апреля 2012 в 6:20

если кто столкнется - можно сделать в шаблоне ноды

<?php<?if(substr(request_uri(),-1)!="/")
      {
        $ri=substr(request_uri(),1);
        
        drupal_goto($ri."/",array(),301);
      }?>