Как я могу сделать чистый Mod_Rewrite, который скрывает номера переменных, переданных в строке запроса, но просто показывает заголовки в php? - PullRequest
0 голосов
/ 16 апреля 2010

Я давно занимаюсь разработкой веб-приложений. Мои приложения плохо справляются с результатами поисковой системы из-за динамических ссылок, которые генерируют мои сайты.

Я восхищаюсь тем, как некоторые разработчики делают свой mod_rewrite для создания чего-то вроде: http://www.mycompany.com/accommodation/europe/ для запуска замены "index.php? Category_id = 2 & country = 23"

Как мне добиться этого в моих URL?

1 Ответ

0 голосов
/ 16 апреля 2010

Вам понадобится сопоставление, чтобы сопоставить имена с идентификаторами. Вы можете сделать это с помощью 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;

Вы должны добавить некоторую обработку ошибок, поскольку в настоящее время перенаправление происходит, даже если оба аргумента отсутствуют.

...