URL-адрес перезаписи динамической страницы БД PHP

Как мне сделать www.mydomain.com/folder/?id=123 ---> www.mydomain.com/folder/xCkLbgGge

Я хочу, чтобы моя страница запроса БД получила собственный URL-адрес, как я видел в твиттере и т. д. и т. д.


person user1121487    schedule 13.06.2012    source источник


Ответы (3)


Этот термин известен как «слаг». Wordpress сделал этот термин популярным. Во всяком случае, хотя.

В конечном счете, вам нужно иметь файл .htaccess, который перехватывает весь ваш входящий трафик, а затем преобразует его на уровне сервера для работы с вашим PHP в том смысле, что вы все равно сохраните логику ?id=123 нетронутой, но для клиента сторона '/folder/FHJKD/' будет видимым результатом.

вот пример файла .htaccess, в котором я использую аналогичную логику .. (то же самое делает и WordPress).

RewriteEngine On
#strips the www out of the domain if there
RewriteCond %{HTTP_HOST} ^www\.domain\.com$

#applies logic that changes the domain from http://mydomain.com/post/my-article
#to resemble http://mydomain.com/?id=post/my-article
RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?id=$1 [QSA,L]

что это сделает, так это возьмет все после domain.com/ и передаст его как переменную в index.php, переменная в этом примере будет «id», поэтому вам нужно настроить логику, которая наилучшим образом соответствует потребностям ваших сайтов.

пример

<?php
 //the URL for the example here: http://mydomain.com/?id=post/my-article
 if($_GET['id'])
 {
   $myParams = explode('/', $_GET['id']);
   echo '<pre>';
   print_r($myParams);
   echo '</pre>';
 }
?>

теперь логика для этого должна быть намного глубже, это только чистый пример на базовом уровне, но в целом и особенно из-за вашей работы с базой данных, я полагаю, вы хотите убедиться, что $myParams чист от вредоносного кода, который может внедрить в ваш PHP или базу данных.

Вывод вышеуказанного $myParams через print_r() будет следующим:

Array(
   [0] => post
   [1] => my-article
)

Для работы с ним вам нужно будет сделать как минимум

echo $myParams[0].'<br />';

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

<?php
 //the URL for the example here: http://mydomain.com/?id=post/my-article
 if($_GET['id'])
 {
   //breaks the variable apart, removes any empty array values and reorders the index
   $myParams = array_values(array_filter(explode('/', $_GET['id'])));
   if(count($myParams > 1)
   {
       $sql = "SELECT * FROM post_table WHERE slug = '".mysql_real_escape_string($myParams[1])."'";
       $result = mysql_query($sql);
   }

 }
?>

Это, по общему признанию, очень грубый пример, вы хотели бы поработать там с некоторой логикой, чтобы предотвратить внедрение mysql, а затем вы примените запрос, как если бы вы сейчас вытаскивали свои статьи, используя только id = 123.

В качестве альтернативы вы также можете пойти совершенно другим путем и исследовать чудеса MVC (Model View Control). Что-то вроде CodeIgniter — это хороший простой MVC-фреймворк для начала работы. Но это зависит от вас.

person chris    schedule 13.06.2012
comment
Это кажется очень сложным, чтобы заставить его работать. Мне нужно использовать его на страницах, которые будут добавлены в базу данных пользователями. Есть ли рабочий пример для этой техники? - единственные, которые мне попадались, описывающие это, требуют изменений в настройках сервера апача. - person user1121487; 14.06.2012
comment
Да, это немного сложно, но... это почти единственный способ добиться того, чего вы хотите. Вам нужно иметь htaccess, как я упомянул, тогда, основываясь на этом, каждый входящий запрос будет проходить через ваш index.php, все, что следует за .com/, будет рассматриваться как переменная, очень похожая на параметр $_GET, т.е.: .com/? идентификатор = 123. При этом вы в основном создаете свой сайт так же, как обычно, та же логика применяется к получению данных из базы данных, что и раньше, вам просто нужно немного по-другому работать с переменной get при начальной загрузке. - person chris; 14.06.2012
comment
к сожалению, вокруг нет ни одного примера, кроме того, который показан, так как у всех буквально разные потребности. В моем примере я преобразовываю переменную ID в массив, используя взорваться, поэтому $myParams[0] будет вашей точкой перехода. Теперь большинство людей добавят дополнительный столбец в свои таблицы базы данных, по крайней мере, таким образом, чтобы они могли легко согласовать то, что у них есть, с этой концепцией, не меняя слишком много. Теперь этот один столбец будет частью slug .com/my-article в вашем URL-адресе, в столбце будет храниться моя статья, которую вы будете искать, и работать с ней, как и с любым другим запросом БД. - person chris; 14.06.2012
comment
Я обновил свой оригинальный пост, чтобы расширить то, о чем я говорю. Однако, как я уже сказал, к сожалению, поскольку все потребности разные, нет одного отдельного примера для использования после того, что кажется малологичным для работы. В общем, единственный способ добиться того, чего вы хотите, - это начать с первоначального исправления htaccess, которое перезаписывает поведение ядра apache для ваших нужд, а затем при этом все последующее зависит от того, что вы делаете с PHP или языком сценариев на стороне сервера. выбора. Пожалуйста, свяжитесь со мной, если хотите, и, возможно, мы сможем с вами разобраться. - person chris; 14.06.2012
comment
Большое спасибо! Я постараюсь вникнуть в это, хотя есть еще много вопросительных знаков. Сначала я начну с основ и попытаюсь понять эту концепцию. Единственное альтернативное решение, которое я могу придумать, - это написать скрипт, который создает файл index.php с db-кодом в качестве включения и помещает его в папку со случайным именем. Хотя и не так аккуратно. - person user1121487; 14.06.2012
comment
не говоря уже о том, что это может вызвать то, что известно как удар, в конечном итоге случайное исчерпание. Если вы хотите создать уникальный идентификатор, такой как HFhjdkfnva, вы можете использовать что-то вроде kevin.vanzonneveld.net/ techblog/article/, который я время от времени использую для одного и того же - person chris; 14.06.2012
comment
но и в целом лучше всего работать с БД. В конечном счете, наличие десятков или более папок со всеми одинаковыми вещами и index.php для вещей БД придет и укусит вас за ... - person chris; 14.06.2012
comment
Я думаю, что я только что получил основы для работы! :) Теперь я немного счастлив! Как насчет использования int post_id из БД в качестве фактического имени URL? Таким образом, БД могла быстрее найти сообщение. - person user1121487; 14.06.2012
comment
не будет иметь значения, вам все равно придется поймать переменную, разбить ее по мере необходимости, а затем передать ее в запрос sql, предполагая, что это вы делаете, и вы не хотите, чтобы ваши запросы были основаны на пользователе ввод, который работает с URL-адресами таким образом, он приемлем в предложении where или подобном предложении или подобном, но использование его в качестве идентификатора для столбца в вашей таблице - просто плохая идея. - person chris; 14.06.2012

Это может быть достигнуто с помощью mod_rewrite, например. через файл .htaccess.

person Valerij    schedule 13.06.2012

В вашем .htacess вам нужно добавить RewriteEngine.

После этого вам нужно будет сделать несколько регулярных выражений, чтобы заставить этого маленького зверя работать. Я предполагаю, что ?id - это folder.php?id=123.

Например, часть папки: RewriteRule ^folder/([a-zA-Z0-9_-]+)/([0-9]+).html$ folder.php?id=$123

person Telshin    schedule 13.06.2012