Изменение структуры сайта означает необходимость изменения URL-адресов с
site/11-foo/21-bar
к
site/1-foo/1-bar
т.е. я хочу использовать RewriteRule для вычитания константы (в этом примере 10) из целого числа во втором аргументе и другой константы (в этом примере 20) из целого числа в третьем аргументе.
Эти простые вычисления сэкономят буквально миллионы 301 редиректа, которые потребуют обработки. Есть ли способ сделать это с помощью mod_rewrite?
Нет, но вы можете использовать RewriteMap и обрабатывать свои переменные внешней программой:
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap
MapType: prg, MapSource: путь файловой системы Unix к допустимому обычному файлу
Здесь источником является программа, а не файл карты. Для его создания вы можете использовать любой язык по вашему выбору, но результатом должна быть исполняемая программа (либо объектный код, либо сценарий с трюком с волшебным куки-файлом '#! / Path / to / интерпретатор' в качестве первой строки).
Эта программа запускается один раз при запуске сервера Apache, а затем связывается с механизмом перезаписи через его дескрипторы файлов stdin и stdout. Для каждого поиска функции карты он будет получать ключ для поиска в виде строки, завершающейся новой строкой на стандартном вводе. Затем он должен вернуть искомое значение в виде строки, завершающейся новой строкой на стандартном выводе, или четырехсимвольной строки `` NULL '', если он не работает (т.е. нет соответствующего значения для данного ключа). Тривиальная программа, которая реализует карту 1: 1 (т.е. ключ == значение), может быть:
#!/usr/bin/perl $| = 1; while (<STDIN>) { # ...put here any transformations or lookups... print $_; }
В нем нет расчета, http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
Хотя у него есть группировка (количество вхождений) и сопоставление, я бы рекомендовал вам использовать глобальное перенаправление на основной index.php и оттуда создать страницу, которую она должна отображать по данным запроса (получить, опубликовать, cookie и т. Д.) это то, что делают большие форумы и большинство CMS (примеры: vbulletin, wordpress, ipb) ...