Правильно, Добрый день, все (ну, сегодня здесь, в Великобритании!)
Я занимаюсь написанием сайта (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
Надеюсь, я понял, что ты прав