Нет способа обычного «подсчета» в .htaccess
. (Вы можете определить карты перезаписи на стороне сервера, которые ссылаются на внешние программы, но я предполагаю, что это выходит за рамки этого вопроса.)
Если у вас ограниченное количество сегментов пути, вы можете жестко закодировать ответы. Например:
RewriteRule ^levels/$ /whatever.php?query=0 [R,L]
RewriteRule ^levels/[^/]*$ /whatever.php?query=1 [R,L]
RewriteRule ^levels/[^/]*/[^/]*$ /whatever.php?query=2 [R,L]
RewriteRule ^levels/[^/]*/[^/]*/[^/]*$ /whatever.php?query=3 [R,L]
RewriteRule ^levels/[^/]*/[^/]*/[^/]*/[^/]*$ /whatever.php?query=4 [R,L]
RewriteRule ^levels/[^/]*/[^/]*/[^/]*/[^/]*/[^/]*$ /whatever.php?query=5 [R,L]
Я бы использовал что-то вроде:
RewriteRule ^levels/(.+)/(.+)/(.+)/(.+)/(.+) basedir/whatever.php?id=$5
Захват обратных ссылок не "считает" их. $5
просто содержит значение 5-го захваченного подшаблона. Это эквивалентно жесткому кодированию. Однако имейте в виду, что шаблон .+
также будет захватывать косые черты (т. Е. Сегменты пути URL). Таким образом, вышеприведенное регулярное выражение «подсчитывает» только первые 5 , когда их может быть намного больше. Существует также технический предел в 9 обратных ссылок.
Обход
Возможный обходной путь - построить строку запроса (добавляя по 1 символ за раз) для каждого слеша (сегмента пути), найденного в исходной строке.
Например:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^1*$
RewriteRule ^levels/(.*)/(.*)$ levels/$1-$2?%{QUERY_STRING}1 [N,DPI]
RewriteRule ^levels/([^/]*)$ /whatever.php?query=%{QUERY_STRING} [R,L]
С учетом запроса на:
http://www.example.com/levels/lev1/lev2/lev3/lev4/lev5/lev6/lev7/lev8/lev9/lev10
Приведет к внешнему перенаправлению на:
http://www.example.com/whatever.php?query=111111111
Тогда в whatever.php
вы посчитаете длину параметра query
URL, чтобы определить количество уровней. Поскольку мы строго рассчитываем количество слешей, количество «уровней» равно +1.
Объяснение
Первый RewriteRule
многократно заменяет все косые черты в исходном URL-пути дефисами (просто произвольный символ) с помощью цикла внутренней перезаписи (флаг N
). На каждой итерации при замене косой черты мы добавляем 1
в конец строки запроса. Флаг DPI
(D
iscard P
athname I
nformation) требуется в этом примере для отбрасывания дополнительной информации о пути из исходного запроса, который в противном случае был бы добавлен к переписанному URL - это необходимо для того, чтобы предотвратить бесконечный цикл перезаписи (и возможный сбой сервера!).
Второй RewriteRule
запускает внешнюю переадресацию после замены всех дополнительных слешей в URL-пути. Строка запроса (которая теперь состоит из строки вида «11111») добавляется к перенаправленному URL-адресу как часть параметра URL-адреса query
.
* * Предостережения тысячи сорок-девять
- В исходном запросе не должно быть строки запроса. Вышеуказанные проверки для одного или нескольких
1
. Возможно, это можно будет адаптировать по мере необходимости.
- Выше "подсчитывает" количество косых черт , а не только количество сегментов пути. Таким образом, косая черта в конце URL-адреса все еще учитывается, хотя последний сегмент пути является «пустым». Регулярное выражение может быть скорректировано, если это нежелательно. Или предварительное правило может быть использовано для удаления косой черты.