Как создать динамические URL-адреса?

У меня есть социальная сеть, которая позволяет пользователям писать блоги и задавать вопросы. Я хочу создать динамические 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 а не в первой логике, которую вы используете …

Преимущества этого

  1. Это быстрее, чем запрос к базе данных
  2. Вы можете масштабировать это много. Вертикально, например: site.com/users/piyushmishra и site.com/forums/mykickassforum или даже на более глубоких уровнях, таких как site.com/category/category-name/post-name/comments/page-3
  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