我不是一名PHP开发人员,我被要求在现有的PHP网站上执行一些搜索引擎优化。
我注意到的第一件事是丑陋的网址,所以我想让这些更改为更有用的信息。以下是所有可能的模式:
/index.php?m=ModuleType&categoryID=id
/index.php?m=ModuleType&categoryID=id&productID=id
/index.php?page=PageType
/index.php?page=PageType&detail=yes
基本上我想要做的就是将它们转换成类似的东西:
/ModuleType/Category
/ModuleType/Category/ProductName
/Page
/Page
在任何建议或示例之前,我没有使用过mod_rewrite!
感谢。
答案 0 :(得分:1)
mod_rewrite宁愿用来做相反的事情:将/ModuleType/Category/ProductName
内部的请求重写为/index.php?m=ModuleType&categoryID=id&productID=id
。使用文档中的新URL是您的应用程序的工作。
编辑以下是一个示例函数的示例,它将您的参数化网址转换为新的网址:
function url($url, $rules) {
$url = parse_url($url);
parse_str($url['query'], $url['query']);
$argNames = array_keys($url['query']);
foreach ($rules as $rule) {
if ($rule[0] == $url['path'] && array_keys($rule[1]) == $argNames) {
$newUrl = $rule[2];
foreach ($rule[1] as $name => $pattern) {
if (!preg_match('/'.addcslashes($pattern, '/').'/', $url['query'][$name], $match)) {
continue 2;
}
$newUrl = str_replace('<'.$name.'>', $match[0], $newUrl);
}
return $newUrl;
}
}
return $url;
}
$rules = array(
array(
'/index.php',
array('m'=>'.*', 'categoryID'=>'.*', 'productID'=>'.*'),
'/<m>/<categoryID>/<productID>'
)
);
echo '<a href="' . url('/index.php?m=ModuleType&categoryID=categoryID&productID=productID', $rules) . '">/ModuleType/Category/ProductName</a>';
答案 1 :(得分:1)
我不是一个mod_rewrite专家,但这是我如何将.htaccess放在Image Flair网站上的一个例子:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)/(.*)\.png$ imageFlair.php?mode=$1&userid=$2 [L]
RewriteRule ^(.*)\.png$ imageFlair.php?userid=$1 [L]
</IfModule>
这基本上映射:
MODE / USERID.png - &gt; ?imageFlair.php模式=模式&安培;用户ID = USERID
和
USERID.png - &gt; imageFlair.php?用户ID = USERID
您应该能够根据自己的需求进行调整,但可能会遇到一些问题:
根据您想要的网址列表,这应该可行,但我不会声称这是最佳或唯一的方式: - )
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)/(.*)/(.*)$ index.php?m=$1&categoryID=$2&productID=$3 [L]
RewriteRule ^(.*)/(.*)$ index.php?m=$1&categoryID=$2 [L]
RewriteRule ^(.*)$ index.php?Page=$1 [L]
</IfModule>
正如所建议的那样,您可能希望将。*替换为[^ /] +,但是当我这样做时我遇到了非匹配问题,并且没有时间进行故障排除,所以YMMV: - )
答案 2 :(得分:1)
从你的帖子中不太清楚变量是什么。但假设ModuleType
,id
(x2)和Page
都是变量,则以下带反向引用的规则应在.htaccess
文件中运行。
RewriteEngine On
RewriteRule ^([^/]+)/([^/]+)$ /index.php?m=$1&categoryID=$2 [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ /index.php?m=$1&categoryID=$2&productID=$3 [L]
RewriteRule ^([^/]+)$ /index.php?page=PageType [L]
RewriteRule ^([^/]+)/detail$ /index.php?page=PageType&detail=yes [L]
最后一个没有真正意义,因为你已经写好了。因此,您可以在最后添加/detail
。
这些应该直接滑过现有应用程序的顶部而不对应用程序进行任何修改。由于它们不会使用[R]
进行重定向,因此对您的用户而言是透明的。