Я хочу изменить этот адрес:
www.domain.com/game.php?id=1
к чему-то вроде этого:
www.domain.com/game/1/THE-NAME-OF-THE-GAME-IN-DB
Как мне это сделать?
И еще один вопрос:
Я хочу, когда пользователь переходит к адресу, который не существует, например, если он не существует:
www.domain.com/game.php?id=9123912 - this ID doesnt exists
Сервер передаст ему ошибку 404. Как мне это сделать?
Большое спасибо.
РЕДАКТИРОВАТЬ:
game.php:
if (isset($_GET['id'])) { $row = mysql_num_rows(mysql_query("SELECT * FROM games WHERE id = '{$_GET['id']}'")); if ($row) { $game = mysql_fetch_array(mysql_query("SELECT * FROM games WHERE id = '{$_GET['id']}'")); Header( "HTTP/1.1 301 Moved Permanently" ); Header( "Location: /game/".$game['id']."/".seo_title($game['name'])); } else { Header( "HTTP/1.1 404 Not found" ); } exit; }
Htaccess:
LIKE YOU SAID. I JUST COPIED.
.htaccess
RewriteEngine On RewriteRule ^game/([0-9]+)/ /game.php?newid=$1
game.php
if (isset($_GET['id'])) { $row = dbgetrow("SELECT * FROM games WHERE id = %s",$_GET['id']); if ($row) { Header( "HTTP/1.1 301 Moved Permanently" ); Header( "Location: /game/".$row['id']."/".seo_title($row['name'])); } else { Header( "HTTP/1.1 404 Not found" ); } exit; } if (isset($_GET['newid'])) $_GET['id'] = $_GET['newid'];
это код, который работает для меня, но считается псевдокодом, который дает вам представление.
Функция dbgetrow () для получения строки из базы данных
и функция seo_title () может быть такой, как эта
function seo_title($s) { $s = strtolower(trim($s)); $s = str_replace(" ","-",$s); $s = preg_replace('![^a-z0-9-]!',"",$s); $s = preg_replace('!\-+!',"-",$s); return $s; }
Вся концепция была зажата от SO 🙂
единственная games/1/
часть действительно важна, а остальное может быть чем угодно, название игры – только для целей seo. Возьмите это название вопроса, например:
Как я могу использовать в .htaccess?
🙂
.htaccess не предназначен для выполнения перезаписи URL-адресов, как вы упоминаете. Если на вашем сервере работает apache, попробуйте это . Если на вашем сервере работает IIS, попробуйте это .
Что касается второго вопроса, если id не существует, попробуйте выполнить game.php перенаправление к имени файла, которое, как вы знаете, не существует (например, 9123912.html). Сервер должен быть настроен для доставки 404 изначально.
Вероятно, лучший способ – перенаправить страницу, чтобы исправить URL-адрес, например, код: (работайте для меня)
if (isset($_GET['id'])) { $script_url = "http://localhost/scripts/myscripts/"; $row = dbgetrow("SELECT * FROM games WHERE id = %s",$_GET['id']); if ($row) { Header( "HTTP/1.1 301 Moved Permanently" ); Header( "Location: ".$script_url."/game/".$row['id']."/".seo_title($row['name'])); } else { Header( "HTTP/1.1 404 Not found" ); } }
и в файле .htaccess вы также можете установить RewriteBase
на такие RewriteBase /
как RewriteBase /
или RewriteBase /YOUR_SCRIPT_PATH_WITHOUT_HOST_NAME/
также см. Apache Doc