Переписать URL, заменив ID на заголовок в строке запроса - PullRequest
3 голосов
/ 09 августа 2011

Я довольно новичок в mod_rewrite, но я немного искал и не могу найти ответ на этот вопрос. У меня есть сайт, на котором есть только одна страница PHP, обслуживающая десятки страниц контента в зависимости от идентификатора, переданного ему в строке запроса. Я хотел бы переписать URL, чтобы этот идентификатор исчезал и заменялся заголовком страницы, взятым из базы данных. Например

www.example.com/index.php?id=19

заменяется на

www.example.com/my-page-title

где "my-page-title" - это заголовок страницы, хранящейся в базе данных с индексом 19.

Есть ли у кого-нибудь опыт такого рода переписывания, или это вообще возможно?

Спасибо

HR

Ответы [ 2 ]

3 голосов
/ 09 августа 2011

Конечно, это возможно, для скрипта PHP ваш .htaccess может выглядеть примерно так:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

При этом все URL-адреса, кроме имен каталогов или файлов, будут перезаписаны в «index.php? Url = THE-TYPED-ADDRESS».

В вашем index.php вы можете использовать значение $ _GET ['url'] для определения идентификатора:

// init DB layer
if (isset($_GET['url']) && !empty($_GET['url'])) {
  $url = my_filter_function($_GET['url']); // filter input
  $pdo = my_get_pdo_function(); // get configured PDO objected
  $query = "SELECT id FROM my_router_table WHERE url = ? LIMIT 1"; // use prepared statements for security/performance reasons

  $stmt = $pdo->prepare($query);
  $stmt->bindValue(1, $url, PDO::PARAM_STR); // bind the value as a string

  // ternary operator expanded for readability
  if ($stmt->execute()) {
    $id = $stmt->fetch(PDO::FETCH_ASSOC);
  } else {
    $id = -1; // 404 page
  }

  // fetch content/render page according to ID
}

Это, очевидно, слишком упрощенный пример, и вам действительно следует убедиться, что вы правильно избегаете ввода и используете подготовленные выражения, чтобы избежать угроз безопасности. Кроме того, если вы используете MySQLi или другой уровень доступа к базе данных, ваш код подготовки / выполнения / выборки будет немного отличаться.

2 голосов
/ 09 августа 2011

Это возможно. Вы переписываете URL для отправки значения $ _GET и используете это значение для поиска нужной строки. URL-адрес ДОЛЖЕН быть уникальным, в противном случае он не может найти эту уникальную строку.

Пример:

RewriteRule ^([\d\w-]+)$ index.php?slug=$1 [L]

Это дает вам значение $_GET['slug'] в PHP, которое затем можно использовать для поиска значения в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...