Условное перенаправление в .htaccess в зависимости от количества сегментов пути в URL - PullRequest
0 голосов
/ 13 января 2019

Я хотел бы сделать перенаправление .htaccess, в зависимости от количества сегментов пути в URL. Однако, если это условие обнаружено, тогда не нужно оценивать условия RewriteRule.

Предположим, у меня есть такой URL:

http://www.example.com/level1/level2/level3/...../levelx

и я хотел бы сделать перенаправление, используя RewriteRule, в зависимости от количества «уровней», которые у меня есть в URL.

Например, если у меня есть еще три «уровня» (что-то вроде http://www.example.com/levels/level1/level2/level3/level4/../100). Я хотел бы перенаправить что-то вроде: http://www.example.com/whatever.php?id=100 page

Однако я бы использовал что-то вроде:

RewriteRule ^levels/(.+)/(.+)/(.+)/(.+)/(.+) basedir/whatever.php?id=$5

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

1 Ответ

0 голосов
/ 20 января 2019

Нет способа обычного «подсчета» в .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-адреса все еще учитывается, хотя последний сегмент пути является «пустым». Регулярное выражение может быть скорректировано, если это нежелательно. Или предварительное правило может быть использовано для удаления косой черты.
...