代码之家  ›  专栏  ›  技术社区  ›  James

如何使用mod ou rewrite显示SEO友好的URL?

  •  4
  • James  · 技术社区  · 15 年前

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

    我注意到的第一件事是难看的URL,所以我想让它们重写成更有用的内容。以下是所有可能的模式:

    /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重写!

    谢谢。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Gumbo    15 年前

    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>';
    
        2
  •  1
  •   Steven Robbins    15 年前

    我不是mod ou重写专家,但这是我如何将.htaccess整合到图像flair站点的一个例子:

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

    这基本上是地图:

    模式/userid.png-> PHP?模式=模式&用户ID=用户ID

    userid.png-> PHP?用户标识=用户标识

    你应该能够适应你的需求,但是你可能有几个问题:

    1. 如果要在URL上使用“名称”而不是ID,则需要更改PHP以接受这些名称。
    2. 如果您还想在with page中包含更多参数,则可能会出现/page和/moduletype冲突的问题,除非您可以将一个可确定哪个参数的regex放在一起。

    在你想要的网址列表上,这应该是可行的,尽管我不会说这是最好的或者唯一的方法。

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

        3
  •  1
  •   Dan Carley    15 年前

    从你的帖子里不太清楚变量是什么。但是假设这样 ModuleType , id (x2)和 Page 如果所有变量都是变量,那么具有backreference的以下规则应该在 .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] 它对您的用户是透明的。