htaccess: переписывание неограниченного количества подкаталогов - PullRequest
1 голос
/ 24 июня 2011

У меня довольно сложная система управления контентом, которую я написал на PHP, которая имеет неограниченные иерархические категории.

У каждой категории есть короткое имя (динамически генерируемое из заголовка категории), которое я использую с mod_rewrite для создания чистых URL, например

http://www.mysite.com/categories/january

Проблема этого подхода заключается в том, что каждой категории требуется уникальное короткое имя для правильной работы. Это создает проблему, когда у меня более одной категории с одинаковым именем, с разными категориями, например / Categories / 2011 / январь и /categories/2010/january.

Самый простой способ преодолеть это - добавить -1, -2 и т. Д., Когда создается дублирующее короткое имя, но я бы предпочел, чтобы вся иерархия категорий использовалась в URL-адресе, и определить правильные идентификаторы на основе этого, например,

http://www.mysite.com/categories/2011/january против http://www.mysite.com/categories/2010/january

У меня такой вопрос: есть ли способ, с помощью которого я могу использовать mod_rewrite для анализа любого количества подкатегорий и возврата их на мою страницу php, возможно, в виде массива значений?

Он должен работать независимо от количества подкатегорий, чтобы он мог обрабатывать, например,

http://www.mysite.com/categories/products/sheds/reports/2011/january

с тем же кодом, и дать моей странице php массив этих категорий в порядке их отображения в URL?

Мой код должен работать в обратном направлении от последней категории, чтобы выяснить, какая категория требуется на основе его родителей.

Является ли это чем-то возможным (и действительно рекомендуемым), и может ли кто-нибудь помочь мне составить правильное регулярное выражение для команды перезаписи, учитывая мое довольно безнадежное понимание регулярных выражений?

Большое спасибо заранее Ник

1 Ответ

3 голосов
/ 24 июня 2011

Я не думаю, что есть какой-то простой способ позволить mod_rewrite разделить данные для вас. Конечно, вы можете создать RewriteRule, который соответствует до 9 виртуальных путей, но я не думаю, что это было бы полезно. Вместо этого я бы предложил определить правило, подобное этому

RewriteRule ^categories/(.*)$ category-handler.php?cat=$1

, а затем выполните разбиение (и изменение порядка) в файле PHP, что-то вроде этого

$cat = $_GET['cat'];
$splittedCat = array_reverse(preg_split('/\//', $cat));
...