使用mod_rewrite实现具有多个变量的友好URL的最佳方法是什么?

时间:2009-08-21 10:27:23

标签: mod-rewrite friendly-url

我正在构建一个客户端js繁重的Web应用程序,数据从服务器块推入。

我正在尝试为友好的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的脚本,查询db以查找匹配的友好url并返回带有映射到的所有params的完整url,然后使用此构建url字符串到网址,然后它会将参数提取到网络应用程序正面。

然而,当我使用php标头(“Location:http://example.com”)函数时,我丢失了友好的URL,因此他们看到带有params的完整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 个答案:

答案 0 :(得分:3)

通常的做法是将带有值的网址映射到参数化网址。例如:

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文件。

答案 1 :(得分:0)

为什么要重定向到参数化的网址?为什么不直接使用该参数化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');
}