Красивый URL для строковых параметров - PullRequest
3 голосов
/ 02 марта 2010

У меня есть сайт, который использует этот стиль: /index.php?page=45&info=whatever&anotherparam=2

Я планирую создать красивый URL для преобразования предыдущего URL в: /profile/whatever/2

Я знаю, что должен использовать .htAccess и перенаправить все в index.php. Все в порядке.

Моя проблема больше в index.php (Front Controller). Как я могу собрать обратно $_GET["info"] и $_GET["anotherparam"], чтобы иметь возможность продолжать использовать весь существующий код, который использует $_GET[...] на своей странице?

Нужно ли мне собирать обратно GET в заголовке с некоторым кодом или мне нужно избавиться от всех $_GET[...] на каждой странице, создав собственный массив, который будет когда-либо анализировать / и назначать что-то вроде $myParam["info"] = "whatever" и чем на странице использовать $myParam[] вместо $_GET[]?

Я не хотел бы изменять все те страницы, которые используют $_GET[]

Edit:

Мой .htAccess выглядит так:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ index.php [NC,L]

Все, что не существует, идет в index.php. Поскольку я уже использую эту структуру: /index.php?page=45&info=whatever&anotherparam=2 ничего не сломано. Но теперь я буду использовать /profile/whatever/2 и в случае переключения я могу определить, какую страницу include(..), но проблема со всеми параметрами GET. Как мне создать их, чтобы иметь доступ со всей страницы с помощью $ _GET []?

Ответы [ 2 ]

3 голосов
/ 03 марта 2010
$path = ... // wherever you get the path $_SERVER[...], etc.
            // eg: /profile/wathever

$segments = split ($path);

$segments_name = Array ('page', 'info', 'anotherparam');
for($i=0;$i  < count ($segments); $i++) {
  $_GET[$segments_name[$i]] = $segments[$i];
}

с этим решением вы всегда должны использовать одни и те же аргументы в одной и той же позиции

, если вы не хотите, чтобы у вас было два решения: - используйте путь как / page / profile / info /wathever - используйте систему маршрутизатора (для этого я рекомендую использовать фреймворк вместо того, чтобы делать все вручную)

edit: второе решение

$path = ... // wherever you get the path $_SERVER[...], etc.
            // eg: /page/profile/info/wathever
$segments = split ($path);

for($i=0;$i  < count ($segments); $i+=2) {
  $_GET[$segments[$i]] = $segments[$i+1];
}
0 голосов
/ 03 марта 2010

Вместо этого используйте оператор switch. Также не забудьте изменить ваш .htaccess

<?php
switch ($_GET) {
    case "home":
     header('Location: /home/');
        break;
    case "customer":
        header('Location: /customer/');
        break;
    case "profile":
        header('Location: /profile/');
        break;
}
?>
...