Как использовать параметр $ _GET для создания дружественных URL-адресов seo?

Я использую PHP CMS, который я сделал сам. Он извлекает url параметра $ _GET и превращает его в www.website.com/{url} . Эта CMS использует параметр $ _GET для получения файла. Итак, если url является index , CMS ищет index файла и возвращает содержимое файла. Но теперь я расширяю CMS, чтобы добавить параметр добавления, например profile/{username} . Как я могу расширить его? Я хочу, чтобы мой URL-адрес сказал: www.website.com/profile/{username} . Как мне это сделать? Это мой текущий htaccess:

 RewriteEngine On RewriteRule ^(|/)$ index.php?url=$1 RewriteRule ^([a-zA-Z0-9_-]+)(|/)$ index.php?url=$1a 

Вот система TPL.

 public function addTpl() { global $zip; if(!isset($_GET['url']) || empty($_GET['url'])) { $_GET['url'] = 'index'; } if(file_exists('_zip/_templates/_front/'. $zip['Template']['Front'] . '/')) { if(file_exists('_zip/_templates/_front/'. $zip['Template']['Front'] . '/' . secure($_GET['url']) . '.php')) { ob_start(); include('_zip/_templates/_front/'. $zip['Template']['Front'] . '/' . secure($_GET['url']) . '.php'); $this->tpl .= ob_get_contents(); ob_end_clean(); } else { die(zipError('File Not Found', 'The file <b>' . secure($_GET['url']) . '</b> could not be found. Please re-check the URL; If you were directed here using a link, please report that link.')); } } else { die(zipError('Template Not Found', 'The template <b>' . $zip['Template']['Front'] . '</b> could not be found. Please check your configuration file for a mistake.')); } } 

Есть ли какая-то другая информация, которую я должен предоставить? Мне нужно сделать это как можно скорее, поэтому любые советы будут высоко оценены.

Solutions Collecting From Web of "Как использовать параметр $ _GET для создания дружественных URL-адресов seo?"

Ответ на php_nub_qq чище: вам было бы лучше в долгосрочной перспективе сделать это, используя $_SERVER['REQUEST_URI'] вместо добавления дополнительных правил перезаписи каждый раз, когда вы хотите добавить новое подразделение в свою CMS. Но я все же ответил ниже, полагая, что вы не хотите слишком сильно менять свой существующий код, так как вы находитесь под пистолетом.

Также вы делаете большие длины, чтобы не устанавливать какие-либо переменные в addTpl (). Это по уважительной причине, поскольку php_nub_qq также уже указывал, что необходимо избегать любых переменных, которые устанавливаются в дочернем шаблоне, которые будут нарушать инкапсуляцию. Но теперь это громоздкая сдержанность, когда вам нужно добавить больше логики к этому методу, поэтому вам, вероятно, следует учесть включение шаблона в частный метод. Затем вы можете сделать любую сложную логику в addTpl (), которую хотите. Чтобы избежать установки каких-либо переменных вообще в файле шаблона, кроме $this , вы можете установить путь к файлу шаблона непосредственно в самом объекте шаблона и использовать его при передаче его методу включения шаблона.

Итак, вы добавили бы другое правило перезаписи:

 RewriteRule ^profile/([a-zA-Z0-9_-]+)(|/)$ index.php?username=$1 

Изменить: я удалил лишнюю косую черту в начале регулярного выражения, которое нарушило это.

Это установит ключ имени пользователя в $_GET , который вы можете использовать для переключения шаблона для загрузки. Затем внутри любого класса addTpl () находится следующее (это также предполагает, что вы меняете свой конфиг, чтобы добавить $zip['Template']['Profile'] который похож на $zip['Template']['Front'] чтобы установить каталог для шаблонов профиля:

 class Template { public $tpl = ''; private $_template_file; public function addTpl() { global $zip; if(!isset($_GET['url']) || empty($_GET['url'])) { $_GET['url'] = 'index'; } $top_dir = '_zip/_templates/'; $type_dir = '_front/'; $configured = $zip['Template']['Front']; $file = $_GET['url']; // Check username val and use custom template: if (!empty($_GET['username'])) { $type_dir = '_profile/'; $configured = $zip['Template']['Profile']; // assuming you're configuring profile templates $file = $_GET['username']; } $full_dir = $top_dir . $type_dir . $configured . '/'; if(file_exists($full_dir)) { $full_file = $full_dir . secure($file) . '.php'; if(file_exists($full_file)) { $this->_template_file = $full_file; $this->tpl .= $this->loadTemplate(); } else { die(zipError('File Not Found', 'The file <b>' . secure($file) . '</b> could not be found. Please re-check the URL; If you were directed here using a link, please report that link.')); } } else { die(zipError('Template Not Found', 'The template <b>' . $configured . '</b> could not be found. Please check your configuration file for a mistake.')); } } private function loadTemplate() { ob_start(); include($this->_template_file); $result = ob_get_contents(); ob_end_clean(); return $result; } } 

Второй параметр ({username)) может быть локальным, прежде чем включать этот файл, в который вы можете получить доступ к нему как к обычной переменной. Это нехорошо, если вы работаете с командой.

EDIT :

Что вы можете сделать, это следующее

 RewriteEngine On RewriteRule ^ index.php 

Тогда в index.php вы можете получить это

 $url = str_replace('index.php','', $_SERVER['PHP_SELF']); $url = str_replace($url,'',$_SERVER['REQUEST_URI']); $url = explode('/',$url); $page = array_shift($url); foreach ($url as $val){ $args[] = urldecode($val); } 

Теперь, если вы откроете ссылку www.website.com/profile/someuser/about вас будет

 $page = 'profile' $args[0] = 'someuser' $args[1] = 'about' 

И так далее, у вас может быть столько аргументов, сколько вам нравится.