如何使用mod_rewrite显示SEO友好URL?

时间:2009-10-03 09:23:58

标签: php mod-rewrite url-rewriting seo

我不是一名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!

感谢。

3 个答案:

答案 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

您应该能够根据自己的需求进行调整,但可能会遇到一些问题:

  1. 如果您想在URL上使用“名称”而不是ID,则需要更改PHP以接受名称。
  2. 如果你想在页面中包含更多参数,你可能会遇到/ Page和/ ModuleType冲突的问题,除非你可以把一个可以确定哪个是哪个正则表达式组合在一起。
  3. 根据您想要的网址列表,这应该可行,但我不会声称这是最佳或唯一的方式: - )

    <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)

从你的帖子中不太清楚变量是什么。但假设ModuleTypeid(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]进行重定向,因此对您的用户而言是透明的。