我本质上并不是一个PHP开发人员,我已经被要求在一个现有的PHP网站上执行一些SEO。

我注意到的第一件事是丑陋的网址,所以我想把这些改写成更有用的东西。以下是所有可能的模式:

/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

在任何建议或例子都是最好的之前,我还没有使用过!

多谢。


重写 宁愿被用来做相反的事:改写/ModuleType/Category/ProductName 在内部/index.php?m=ModuleType&categoryID=id&productID=id .在文档中使用新的URL是应用程序的工作。


编辑    下面是一个函数看起来如何将参数化的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>';

无论如何,我都不是一个重写的专家,但这是一个例子,说明我是如何组合的。图像天赋网站的访问:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)/(.*)\.png$ imageFlair.php?mode=$1&userid=$2 [L]
RewriteRule ^(.*)\.png$ imageFlair.php?userid=$1 [L]
</IfModule>

这基本上表明:

模式/用户......模式=模式和用户身份=用户身份

用户.......用户名=用户名

你应该能适应你的需要,但你可能有一些问题:

  1. 如果你想在URL上使用"名称"而不是"ID",你需要修改PHP来接受这些名称。
  2. 如果您想在页面中加入更多的参数,那么您可能会对/页和/模式类型冲突产生问题,除非您能够组合一个可以确定哪个是哪个的Rgex。

在你想要的网址列表中,这应该行得通,尽管我不会说这是最好的或唯一的方法:-)

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

如建议的,你可能需要替换。*与[^/]+但是当我这样做的时候我对非匹配有问题,而且没有时间去排除故障,所以YMV:-)


从你的帖子上看不出这些变量是什么。但是假设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] 它对你的用户是透明的。


好吧,那我怎么做呢?如何将参数化的查询转换为更好的URL?

詹姆斯:你的网络应用程序应该这样做。通常情况下,您会有一个映射来从一个表单映射到另一个表单。

是的,但是我不太确定我是怎么做的,你能举个例子吗?

@詹姆斯: 很适合参数化 或 参数化为尼斯 方向?

@秋波,基本上网站目前的方式是网站显示为参数化,所以我希望他们显示得更好。