PHP + HTACCESS + mod_rewrite + сегменты URL с разной длиной

Правильно, Добрый день, все (ну, сегодня здесь, в Великобритании!)

Я занимаюсь написанием сайта (PHP / MySQL), который использует дружественные URL-адреса.

Я настроил свой htaccess (mod_rewrite включен) и имеет базовый скрипт, который может обрабатывать «/», а затем все остальное обрабатывается после «?» в том же скрипте. Т.е. я могу решить, пытался ли пользователь поставить example.com/about , example.com/about/the-team или example.com/join/?hash=abc123etc и т. Д.

Мой вопрос заключается в том, как обрабатывать URL-адреса переменной длины, такие как (примеры):

example.com/about (только узел)
example.com/about/the-team (node ​​+ seo-page-title)
example.com/projects (только для узла)
example.com/projects/project-x (узел + подузел)
example.com/projects/project-x/specification (node ​​+ sub-node + seo-friendly-title)
example.com/news/article/new-article (узел + под-узел + seo-friendly-title)
example.com/join/?hash=abc123etc&this=that (узел + запрос)

НО, «узлы» (первый аргумент), «под-узлы» (второй аргумент) или «безопасные названия страниц» могут отсутствовать или неизвестны (управляются базой данных), поэтому я не могу поместить обработку в .htaccess специально. Помните: я уже (я думаю!) Получил рабочий htaccess, чтобы переместить все правильно на мой PHP-скрипт. Все, что не найдено, будет отправлено на CMS «404».

Я думаю, что у моего клиента будет максимум три аргумента (а потом все остальное будет после «?»).

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

Я попытался в предыдущем проекте, но мне всегда приходилось прибегать к написанию CMS, чтобы заставить пользователя иметь (при добавлении страниц) хотя бы узел ИЛИ узел + subnode + seo-friendly-title, который я хотел бы уйти из…

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

Большое спасибо!

Вы можете обслуживать различное количество совпадений:

 RewriteRule ^/([^/])* /content.php?part1=$1 [L,QSA,NC] RewriteRule ^/([^/])*/([^/])* /content.php?part1=$1&part2=$2 [L,QSA,NC] RewriteRule ^/([^/])*/([^/])/([^/])* /content.php?part1=$1&part2=$2&part3=$3 [L,QSA,NC] 

Где [^ /] соответствует любому символу, отличному от '/', а затем, поскольку этот термин заключен в () скобки, его можно использовать в переписанном URL.

QSA будет обрабатывать все параметры и правильно привязывать их к переписанному URL.

То, как вы сравниваете детали с вещами, о которых вы знаете, зависит от вас, но я полагаю, что что-то подобное было бы разумным:

 $knownKnodes = array( 'about', 'projects', 'news', 'join', ); $knownSubNodes = array( 'the-team', 'project-x', 'the-team' ); $node = FALSE; $subNode = FALSE; $seoLinks = array(); if(isset($part1) == TRUE){ if(in_array($part1, $knownNodes) == TRUE){ $node = $part1; } else{ $seoLinks[] = $part1; } } if(isset($part2) == TRUE){ if(in_array($part2, $knownSubNodes) == TRUE){ $subNode = $part2; } else{ $seoLinks[] = $part2; } } if(isset($part3) == TRUE){ $seoLinks[] = $part3; } if(isset($part4) == TRUE){ $seoLinks[] = $part4; } 

Очевидно, что список узлов и поднодов можно вытащить из БД, а не быть жестко закодированным. Точные детали того, как вы сопоставляете известные вещи с бесплатным текстом, действительно зависит от вас.

в какой структуре php-скрипт получает информацию?

если структура для 'example.com/news/article/new-article'

 $_GET[a]=news $_GET[b]=article $_GET[c]=new-article 

вы можете проверить, пуст ли $_GET[c] ; если не реальный сайт $_GET[b] , и поэтому один …

другой способ заключается в том, что $_GET[a] вернется со следующим 'news_article_new-article' в этом случае у вас есть уникальное имя для DB-search

Надеюсь, я понял, что ты прав