У меня есть социальная сеть, которая позволяет пользователям писать блоги и задавать вопросы. Я хочу создать динамические URL-адреса, которые публикуют заголовок блога или вопрос в конце URL-адреса через PHP.
Пример:
www.blah.com/the_title_here
Ищите самый чистый наиболее эффективный способ добиться этого.
Обычно вы храните URL-дружественный «slug» в строке базы данных, а затем скрипт PHP, который находит сообщения, соответствующие этому slug.
Например, если у вас есть скрипт под названием index.php
который принял параметр slug
…
<?php if (isset($_GET['slug'])) { $sql = "SELECT * FROM `your_table` WHERE slug = ? LIMIT 1"; $smt = $pdo->prepare($sql); $smt->execute(array($_GET['slug'])); $row = $smt->fetchObject(); // do something with the matching record here... } else { // display home page }
… Затем вы могли переписать запросы с использованием .htaccess:
RewriteEngine on RewriteRule ^(.+)$ index.php?slug=$1
Использование базы данных для этого было бы грустно 🙁 Может быть много случаев, когда вам не нужно искать базу данных, и вы будете использовать этот метод, например: – www.blah.com/signup
(здесь нет смысла). И db соединения питаются ресурсами, серьезными ресурсами …
RewriteEngine on RewriteRule ^(.+)$ index.php?slug=$1
как показывает Мартин, вы получаете путь или слизню.
Большинство фреймворков используют файловую систему для получения более чистых URL-адресов. Одна папка для хранения всех файлов и что-то похожее в теории на
<?php $default = "home"; //function to make sure the slug is clean ie doesnot contain ../ or something if(isset($_GET['slug'])) $slug = clean($_GET['slug']); if(!isset($slug)) $slug = $default; $files = explode('/',$slug);// or any other function according to your choice $file = "./commands/".$files[0].".php"; if(file_exists($file)) require_once($file); else require_once("./commands/".$default.".php");
Вы можете сделать это настолько простым и сложным, насколько хотите. Вы даже можете использовать базу данных для определения случая по умолчанию, как то, что сделал Мартин, но это должно быть в $default
а не в первой логике, которую вы используете …
Преимущества этого
site.com/users/piyushmishra
и site.com/forums/mykickassforum
или даже на более глубоких уровнях, таких как site.com/category/category-name/post-name/comments/page-3
./ACLcommands/users.php
, ./XMLRPC/ping.php
Есть много программ с открытым исходным кодом, которые делают это, вы можете посмотреть на WordPress.org или MediaWiki.org, чтобы сделать это. Вам понадобится комбинация настроек .htaccess
или Apache, чтобы добавить к ним правила mod_rewrite
.
Затем вам понадобится файл контроллера, который написал Мартин Бин, чтобы посмотреть сообщение … но убедитесь, что вы правильно выполняете / санируете / проверяете ввод, иначе вы можете быть уязвимы для SQL-инъекций или XSS, если у вас есть JavaScript на вашем сайте ,
Поэтому лучше использовать метод id и использовать только slug для целей довольно-url. Программное обеспечение WordPress.org также предполагает, что только слизь замедляет работу, когда у вас много сообщений. Итак, вы можете использовать комбинацию www.blah.com/slug-phrase-goes-before-the-numeric_id
и написать RegExp для соответствия:. .*(\d+)$
"www.blah.com/$id/".preg_replace('/^[az-]+/','',preg_replace('/[ ,;.]+/','-',strtolower($title)))
и используйте только $id
из названия
"How do I create dynamic URLs?"
он создает URL-адрес
www.blah.com/15/how-do-i-create-dynamic-urls