Вам понадобится сопоставление, чтобы сопоставить имена с идентификаторами. Вы можете сделать это с помощью mod_rewrite. Или, что я предлагаю, вы можете использовать PHP для этого:
// maps that map the names to IDs
$categories = array('accommodation'=>2 /*, … */);
$countries = array('europe'=>23 /*, … */);
$_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/'));
// map category name to ID
$category = null;
if (isset($segments[0])) {
if (isset($categories[$segments[0]])) {
$category = $categories[array_shift($segments)];
} else {
// category not found
}
} else {
// category missing
}
// map country name to ID
$country = null;
if (isset($segments[0])) {
if (isset($countries[$segments[0]])) {
$country = $countries[array_shift($segments)];
} else {
// country not found
}
} else {
// country missing
}
Теперь вам нужно всего лишь одно правило, чтобы переписать запрос к вашему PHP-скрипту:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule %{REQUEST_FILENAME} !-d
RewriteRule !^index\.php$ index.php [L]
Это правило исключает запросы, URL которых может быть сопоставлен с существующими обычными файлами (-f
) или существующими каталогами (-d
).
Редактировать Так как вы действительно хотите наоборот: если вы все еще хотите решить эту проблему с помощью PHP, то вам просто нужны обратные отображения (просто обмен ключами и значениями) и функция header
для редирект:
// maps that map the IDs to names
$categories = array(2=>'accommodation' /*, … */);
$countries = array(23=>'europe' /*, … */);
$newPath = '';
// map category ID to name
if (isset($_GET['category_id'])) {
if (isset($categories[$_GET['category_id']])) {
$newPath .= '/'.$categories[$_GET['category_id']];
} else {
// category not found
}
} else {
// category missing
}
// map country ID to name
if (isset($_GET['country'])) {
if (isset($countries[$_GET['country']])) {
$newPath .= '/'.$countries[$_GET['country']];
} else {
// country not found
}
} else {
// country missing
}
header('Location: http://example.com'.$newPath);
exit;
Вы должны добавить некоторую обработку ошибок, поскольку в настоящее время перенаправление происходит, даже если оба аргумента отсутствуют.