Каков наилучший способ реализовать дружественный URL с несколькими переменными, используя mod_rewrite? - PullRequest
4 голосов
/ 21 августа 2009

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

Я пытаюсь реализовать решение для дружественного URL-решения, которое принимает URL-адрес, например:

http://exmample.com/find/SomethingHere-or-there

Это соответствует серии невидимых переменных. Так что это может закончиться обработкой так:

http://exmample.com/index.php?loc=London&type=2&priceCat=10-15

Я получаю значения, передав дружественный URL-адрес в качестве параметра, а затем возвращаю полный URL-адрес.

Моя первоначальная реализация использовала правило mod_rewrite для пересылки в скрипт, который извлекает дружественный URL-адрес, запрашивает у БД соответствующий дружественный URL-адрес и возвращает полный URL-адрес со всеми параметрами, на которые он отображает, строит строку URL с этим и затем пересылает на веб-адрес, по которому он будет извлекать параметры на лицевую сторону веб-приложения.

Однако я теряю дружественный URL, когда использую заголовок php ("Местоположение: http://example.com") функция, поэтому они видят полный URL с параметрами. Это одно из вторичных требований, которые я пытаюсь выполнить.

Затем я подумал, что, поскольку мое веб-приложение тяжелое, мне следует попробовать отобразить страницу, а затем передать параметры из базы данных в мое веб-приложение? Это лучший способ или есть еще один способ добиться этого, о котором я не знаю?

Отсутствие включенной js на стороне клиента не является проблемой.

прикреплен некоторый код для описания моей первоначальной реализации:

//get the friendly url as a parameter
$goto = explode('=',$_SERVER['QUERY_STRING']);
//$goto[1] = SomethingHere-or-there

//build the friendly URL string
$forwardingURL = 'Location:http://'.$_SERVER['HTTP_HOST'].'/'.getForwardedURL($goto[1]);

//will be http://exmample.com/index.php?loc=London&type=2&priceCat=10-15
header($forwardingURL);

//function that returns the full url param string from the friendly url
function getForwardedURL($friendlyURL){     
$friendlyURL = mysql_escape_string($friendlyURL);
$query = "
SELECT url
FROM FriendlyURLmapping
WHERE friendly_url = \"$friendlyURL\"";

$resultP = mysql_query($query) 

//the full parametised URL will be in $row
$row = mysql_fetch_array($resultP, MYSQL_ASSOC);    
return $row["url"];
}   

Ответы [ 2 ]

3 голосов
/ 21 августа 2009

Обычной практикой является сопоставление URL-адресов со значениями в них параметризованным URL-адресом. Например:

http://example.com/London/2/10-15
до
http://example.com/index.php?loc=London&type=2&priceCat=10-15

Это можно сделать как в .htaccess:

RewriteEngine on
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ /index.php?loc=$1&type=$2&priceCat=$3 [L]

Я бы избегал перенаправления, если это вообще возможно. Если вы хотите, чтобы совершенно разные URL-адреса отображались на параметры, как, например, в вашем примере (от /something-here до /index.php?...), тогда все, что вам нужно сделать, это переработать приложение, чтобы вы либо передали параметры в функцию, отображающую страницу, либо задали переменные и включают другой файл PHP, который выполняет обработку.

0 голосов
/ 21 августа 2009

Почему вы перенаправляете на этот параметризованный URL? Почему вы просто не используете этот параметризованный URL и не возвращаете фактическое содержимое?

Так что вместо того, чтобы делать перенаправление, сделайте что-то вроде этого:

$url = 'http://example.com/index.php?loc=London&type=2&priceCat=10-15'; // resolved from http://example.com/find/SomethingHere-or-there
// split URL into its parts
$url = parse_url($url);
// check if requested file exists
if (is_file($_SERVER['DOCUMENT_ROOT'].$url['path'])) {
    // parse and merge URL parameters
    parse_str($url['query'], $params);
    $_GET = array_merge($_GET, $params);
    // include resolved file
    include $_SERVER['DOCUMENT_ROOT'].$url['path'];
} else {
    hedaer($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
}
...