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

Mod rewrite 使用mod_rewrite实现具有多个变量的友好URL的最佳方法是什么?,mod-rewrite,friendly-url,Mod Rewrite,Friendly Url,我正在构建一个web应用程序,该应用程序是客户端js,大量数据从服务器中分块推送 我正在尝试为友好的URL解决方案实施一个解决方案,该解决方案采用如下URL: 这相当于一系列不可见的变量。因此,它可能会以如下方式结束处理: 我通过将友好URL作为参数传递,然后返回完整的URL来获得这些值 我的初始实现使用mod_重写规则转发到一个脚本,该脚本提取友好url,查询db以获得匹配的友好url,并返回完整url及其映射到的所有参数,使用该参数构建url字符串,然后转发到web地址,然后将参数提取到

我正在构建一个web应用程序,该应用程序是客户端js,大量数据从服务器中分块推送

我正在尝试为友好的URL解决方案实施一个解决方案,该解决方案采用如下URL:

这相当于一系列不可见的变量。因此,它可能会以如下方式结束处理:

我通过将友好URL作为参数传递,然后返回完整的URL来获得这些值

我的初始实现使用mod_重写规则转发到一个脚本,该脚本提取友好url,查询db以获得匹配的友好url,并返回完整url及其映射到的所有参数,使用该参数构建url字符串,然后转发到web地址,然后将参数提取到web应用程序前端

但是,当我使用php头(“Location:”)函数时,我丢失了友好的url,因此他们可以看到带有参数的完整url。这是我试图满足的次要要求之一

然后我想,由于我的web应用程序是js重的,我应该尝试渲染页面,然后将数据库中的参数ajax到我的web应用程序中吗?这是最好的方法还是有其他我不知道的技巧来实现这一点

没有启用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"];
}   

为什么要重定向到那个参数化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');
}

通常的做法是将包含值的URL映射到参数化URL。例如:



可以在.htaccess中这样做:

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

如果可能的话,我会避免重定向。如果您希望完全不同的URL映射到参数,如您的示例(
/somethine here
/index.php?…
),那么您需要做的就是重新编写应用程序,以便将参数传递给显示页面的函数,或者设置变量并包含另一个进行处理的PHP文件。

目标是获得好的URL。您也可以使用mod rewrite将域名后的所有内容导出到$\u URL,然后您可以用斜杠将其分解并用PHP解析每个部分。我同意,流行的做法是在URL中构建参数。但是,需要构建非直接参数映射。原因是参数的数量可能会改变,否则我可以假设url映射从example.com/London/2/10-15到example.com/index.php?loc=London&type=2&priceCat=10-15@Joe:那么,您将参数映射存储在哪里?我的回答的后半部分应该会有所帮助,您只需将
/somethine here
设置为映射到
index.php?param=somethine here
,然后使用该php脚本显示必要的信息。@disgludedgoat在数据库中。当我将友好url转发到我的页面时,我实际上使用友好url作为完整参数列表/查询字符串的查找,以传递到客户端进行处理。我将看看我是否可以精简一些代码来概述我的实现