2009-08-21 10 views
4

Je suis en train de construire une application web qui est lourde pour le client, les données étant poussées en morceaux par le serveur.Quelle est la meilleure façon de mettre en œuvre une URL conviviale qui a plusieurs variables en utilisant mod_rewrite?

Je suis en train de mettre en œuvre une solution pour une solution d'URL conviviale qui prend une URL comme:

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

Cela équivaut à une série de variables non visibles. Ainsi, il pourrait finir par le traitement comme ceci:

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

Je reçois les valeurs en passant l'URL conviviale comme paramètre puis revenir l'URL complète. Mon implémentation initiale utilisait une règle mod_rewrite pour transmettre à un script qui extrait l'URL amicale, interroger la base de données pour une URL amicale correspondante et renvoyer l'URL complète avec tous les paramètres auxquels elle correspond, construire la chaîne d'URL avec ceci transmettre à l'adresse Web dont il extraira ensuite les paramètres à l'avant de l'application Web.

Cependant, je perds l'URL amicale lorsque j'utilise la fonction d'en-tête php ("Location: http://example.com") pour qu'ils voient l'URL complète avec les paramètres. C'est l'une des exigences secondaires que j'essaie de remplir.

J'ai alors pensé que comme mon application web est trop lourde, devrais-je essayer de rendre la page puis ajax les paramètres de la base de données à mon application web? Est-ce le meilleur moyen ou y at-il un autre truc pour y parvenir que je ne connais pas?

Ne pas avoir js activé côté client n'est pas un problème.

ci-joint un code pour décrire ma mise en œuvre inital:

//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"]; 
} 

Répondre

3

La pratique normale consiste à cartographier les URL avec des valeurs en eux à l'URL paramétrées. Par exemple:

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

Cela peut se faire comme si dans .htaccess:

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

Je voudrais éviter de rediriger si possible. Si vous souhaitez que des URL complètement différentes soient mappées aux paramètres, comme votre exemple (/something-here à /index.php?...), tout ce que vous devez faire est de retravailler votre application pour que vous passiez les paramètres à une fonction qui affiche la page, ou définissez les variables et incluez un autre fichier PHP qui effectue le traitement.

+0

Vous pouvez également utiliser mod-rewrite pour exporter tout ce qui suit votre nom de domaine vers le $ _URL, alors vous pouvez simplement l'exploser par les barres obliques et analyser chaque partie avec PHP. – Breakthrough

+0

Je suis d'accord, la pratique courante consiste à intégrer dans l'URL les paramètres. Cependant, l'exigence est de construire un mappage de paramètres non-direct. Raison étant que le nombre de paramètres pourrait changer sinon je pourrais supposer un mappage d'URL de: example.com/London/2/10-15 à example.com/index.php?loc=London&type=2&priceCat=10- 15 – thiswayup

+0

@Joe: où stockez-vous vos mappages de paramètres? La dernière partie de ma réponse devrait vous aider, tout ce que vous avez à faire est de mettre '/ something-here' pour mapper' index.php? Param = something-here' puis utilisez ce script PHP pour afficher les informations nécessaires. – DisgruntledGoat

0

Pourquoi redirigez-vous à cette URL paramétrées? Pourquoi n'utilisez-vous pas simplement cette URL paramétrée et renvoyez le contenu réel?

Ainsi, au lieu de faire une redirection, faire quelque chose comme ceci:

$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'); 
} 
+0

L'objectif est d'obtenir de bonnes URL. – Dykam

Questions connexes