我不是在心脏一个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的任何建议或之前的例子将是巨大的!
谢谢。
mod_rewrite的宁可被用来做相反的事情:改写的请求/ModuleType/Category/ProductName
内部到/index.php?m=ModuleType&categoryID=id&productID=id
。 在文档中使用新的URL是应用程序的工作。
编辑下面是一个函数可能看起来怎么样,将您的参数的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>';
我不以任何方式一个mod_rewrite的专家,但是这是我如何放在一起的.htaccess的图像弗莱尔网站的例子:
<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? - > imageFlair.php模式=模式&的userid = USERID
和
USERID.png - > imageFlair.php用户id = USERID
您应该能够是去适应你的需求,但你可能有几个问题:
- 如果你想使用你的网址“名称”,而不是ID,您就需要改变PHP接受的名字。
- 你可能有/页和/ ModuleType冲突的一个问题,如果你想也包括与页的详细参数,除非你可以把一个正则表达式,可以决定哪个是哪个。
去你想要的URL列表上,这应该工作,虽然我不会要求它做到这一点的最佳或唯一办法:-)
<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>
至于建议,您可能需要更换。*用[^ /] +,但我不得不与非匹配的问题时,我这样做,并没有时间来解决,所以因人而异:-)
这不是从您的帖子相当清楚的变量。 但是,假设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]
这将是透明的用户。