вторник, 12 июля 2011 г.

Чистые ссылки. Что это? Реализация. Проблемы и решения

"Чистыми" URL (или "чистыми" ссылками, в английском написании "clean URLs") называют URL вида: http://mysite.com/node/1. Т.е. в теле ссылки нет никаких знаков "?" или "&". Обычно ссылка в Drupal выглядит как: http://mysite.com/index.php?q=node/1, что согласитесь намного менее приятно. Именно поэтому придуман механизм "чистых" URL, которые более удобочитаемы и понятны.

Хотя в Drupal 5 "чистые" URL включались в админке Drupal, а в Drupal 6 предлагается включить "чистые" URL прямо при установке (если это возможно, конечно), сам Drupal к реализации "чистых" URL не имеет никакого отношения. Единственное, что делает Drupal, если включены чистые ссылки - это при формировании страницы учитывает это и показывает ссылки в "чистом" виде. А всю работу по корректному отображению страниц, адресованых по "чистым" URL, делает веб-сервер. Поскольку в большинстве случаев в качестве веб-севрера всё-таки работает Apache, то можно говорить, что всю необходимую для "чистых" URL работу проделывает модуль Apache mod_rewrite, а Drupal лишь предоставляет этому модулю необходимые настройки.

Где же хранятся эти настройки и что они из себя представляют? Настройки для модуля mod_rewrite находятся в файле .htaccess, который находится в корневом каталоге Drupal (т.е. там где лежит index.php). После установки Drupal со включенными "чистыми" URL они выглядят так:


RewriteEngine on

# RewriteBase /

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


Я показал только интересующие нас строки из файла .htaccess, на самом деле их там намного больше!

Итак, поясняю, что же здесь написано. Как можно заметить весь блок находится между строками:


...


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

Далее, директива

RewriteEngine On

говорит о том, что для данного каталога (и всех его подкаталогов, если в них самих не указано отдельно) включена обработка URL с помощью модуля mod_rewrite. Если вам в каком-либо подкаталоге захочется выключить эту обработку или даже вообще захочется отказаться от "чистых" URL, то всё что вам нужно сделать это указать "Off" вместо "On", не удаляя собственно никаких правил преобразования URL.

Далее, обратите внимание на строку

# RewriteBase /

Вообще-то, строки, которые начинаются на "#" считаются комментариями и не рассматриваются как правила для модуля mod_rewrite. Но данная строка приведена мной, потому что она может играть важную роль, если ваш Drupal установлен не в корневой каталог вашего сайта, а является лишь его разделом (например, если он установлен в подкаталог drupal (http://mysite.com/drupal)). Об этом я расскажу ниже в разделе решения возможных проблем.

И вот, наконец, мы добрались до нужного нам правила, состоящего из нескольких строк:

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

Как видите, правило снабжено английским комментарием "Rewrite URLs of the form 'x' to the form 'index.php?q=x'" (Преобразовать URL 'x' в конструкциях типа 'index.php?q=x'). Разьясняю подробно каждую строчку. Для начала обратите внимание, что сперва идёт три строки RewriteCond и только одна строка RewriteRule. Строки RewriteCond описывают условия срабатывания правила преобразования URL, а строка RewriteCond описывает собственно само правило. Последовательно следующие друг за другом строки RewriteCond обьединяются с уловием логического "И". Итак, первые три строки с RewriteCond говорят следующее: если указанное в URL имя не является существующим файлом И, при этом, указанное в URL имя не является существующим каталогом, И, при этом не совпадает с 'favicon.ico', то применить нижеследующее правило.... Т.е. если вы, например создадите на своём сайте файл или каталог с именем "node/1" и при этом наберёте в браузере http://mysite.com/node/1, то даже при включенных "чистых" URL правило не сработает и вам будет отдан существующий файл node/1 (если это файл) или индексный файл каталога node/1 (если это каталог и в нём есть индексный файл).

И в заключении, разберём собственно строку правила с преобразованием URL. Правило преобразования URL в строке RewriteRule говорит: заменить ВСЁ что указанно в пути URL, подставив вначале "index.php?q=", а затем весь путь.. Конструкция "^(.*)$" в первой части (части поиска) означает шаблон, который совпадает с полным путём в URL (т.е. всем, что находится за http://имя_сайта), а конструкция во второй (подстановочной части) "$1" означает первое найденное совпадение с шаблоном (т.е. в нашем случае весь путь). После выполнения данного правила, например над URL http://mysite.com/node/1, веб-серверу будет передан другой URL: http://mysite.com/index.php?q=node/1. И именно в таком виде данный URL будет обработан самим Drupal.

Вот, собственно, и весь секрет "чистых" URL и того как они работают
Возможные проблемы и пути их решения

Новички часто сталкиваются с тем, что у них не работают "чистые" URL. Начинаются судорожные поиски решения в самом Drupal, насилование админки и т.д. Но как вы уже поняли после прочтения данной статьи, сам Drupal не имеет к правильной работе "чистых" URL почти никакого отношения. Поэтому, для настройки "чистых" URL необходимо корректно настроить веб-севрер. Когда Drupal увидит, что веб-сервер настроен корректно, то легко начнёт работать с "чистыми" URL..

Итак не работают "чистые" ссылки:

1. Проверьте возможно ли их включить в административном разделе: /admin/settings/clean-urls (здесь и далее путь указан без указания: http://имя_сайта). Если они включаются значит и проблемы больше нет, работайте!
2. Проверьте наличие в файле .htaccess в корневом каталоге вашего Drupal строк, которые были описаны в статье. Если файла .htaccess нет или в нём нет означеных строк, то создайте файл и добавьте строки. Затем вновь переходите к п.1
3. Если есть .htaccess и в нём необходимые строки, а всё-равно ничего не работает, то убедитесь, что у вашего хостинг-провайдера в настройках вашего хостинга разрешено использовать файлы .htaccess. Некоторые хостинг-провайдеры отключают такую возможность по-умолчанию! Убедитесь также, что модуль mod_rewrite у вашего веб-сервера установлен и включен. Вы можете это выяснить также у вашего хостинг-провайдера (хостера).
4. Убедитесь, что в настройках вашего сайта, для каталога сайта, в директиве AllowOverride стоит как минимум значение Limit FileInfo Options Indexes, а лучше All. Если вам недоступен даже на чтение ваш файл с настройками сайта, обратитесь с этим вопросом к хостеру. Поскольку FileInfo контрлирует работоспособность директив mod_rewrite, то без включения этой опции чистые ссылки работать не будут.
5. Если вы прошли пукнты 2,3,4 и не работает, то убедитесь, что перед означеными строками нет других правил для mod_rewrite, которые могут конфликтовать с описанными в данной статье правилами.
6. Если и конфликтующих правил нет и не помогает, попробуйте заменить строчку

RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

на

RewriteRule ^(.*)$ /index.php?q=$1 [L,QSA]

7. Если не помогает и это, попробуйте поиграться с директивой RewriteBase. Возможно вам поможет установка в этой директиве либо относительного пути для вашего каталога с Drupal (например, если вы ставите Drupal не в корневой каталог сайта, а в подкаталог). Т.е. при названии подкаталога скажем drupal, попробуйте указать

RewriteBase /drupal

Возможно это и не все проблемы, которые случаются при неработающих "чистых" URL, однако в 99% написанное вам поможет. А если вы нашли новую проблему и решение, присылайте на указанный ниже адрес электронной почты для назидания потомкам.

2 комментария:

  1. Здраствуйте мой сат http://pornobezsms.com уже 4 месяца как создан и яндексом не индексируется 1 страница и все,по всем запросам с поисковика ведут на главную эту 1 страницу которая в индексе,скажите влияют ли чистые ссылки на это и как исправить проблему,что бы все ноды попали в индекс у меня их много?
    Очень буду Вам благодарен за помощь)))
    Спасибо!

    ОтветитьУдалить
  2. Жду ответа, а ответа нету...=)
    Напишите тему о хотлинк,а то что то с других постов ставил коды приведённые, вместо всего на моём сайте картинки проподали, а на L(левых) ресурсах остовались...

    ОтветитьУдалить