请重写URL重写建议

时间:2011-11-08 13:50:36

标签: php apache url-rewriting

我想让我的网址更加友好,例如改变它:

http://www.chillisource.co.uk/product?&cat=Grocery&q=Daves%20Gourmet&page=1&prod=B0000DID5R&prodName=Daves_Insanity_Sauce

这样的好事:

http://www.chillisource.co.uk/product/Daves_Gourmet/Daves_Insanity_Sauce

这样做的最佳方式是什么?我已经看过用htaccess文件做这个,但这看起来很复杂。

提前致谢

5 个答案:

答案 0 :(得分:2)

Ben Paton,实际上有一个非常简单的方法。像Wordpress这样的CMS倾向于使用它而不是乱用正则表达式。


.htaccess

首先,使用带有以下内容的.htacess:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.php [L]
</IfModule>

让我解释它的作用(逐行):

  • 如果名为mod_rewrite的apache模块存在..
    • 打开模块
    • 让我们知道我们会在之后重写任何内容 域名(仅重写某些目录,使用RewriteBase /subdir/
    • 如果请求的路径不存在为文件...
    • 它甚至不存在作为目录......
    • “重定向”请求到index.php文件
  • 关闭我们的模块条件

以上只是一个简单的解释。你真的不需要它来使用它。

我们做了什么,是我们告诉Apache所有最终都是404的请求将它们传递给index.php文件,我们可以手动处理请求。


PHP方

在PHP端,在index.php内,您只需要解析原始URL。此网址在$_SERVER变量中传递为$_SERVER['REDIRECT_URL']

最好的部分,如果没有重定向,则不设置此变量!

因此,我们的代码最终会像:

if ( isset( $_SERVER['REDIRECT_URL'] ) ) {

    $url = explode('/', $_SERVER['REDIRECT_URL'] );

    switch($url[0]){
        case 'home': // eg:    /home/
            break;
        case 'about': // eg:    /about/
            break;
        case 'images': // eg:    /images/
            switch( $url[1] ){
                case '2010': // eg:    /images/2010/
                    break;
                case '2011': // eg:    /images/2011/
                    break;
            }
            break;
    }

}

轻松整合

我几乎忘记提及这一点了,但是,由于它的工作方式,你甚至可以根本不改变你现有的代码!

少说话,多举例。假设你的代码看起来像:

<?php

    $page = get_page($_GET['id']);
    echo '<h1>'. $page->title .'</h1>';
    echo '<div>'. $page->content .'</div>';

?>

与网址合作:

index.php?id=5

您可以将其与SEO URL一起使用,同时将其与旧系统保持一致。首先,确保.htaccess包含我在上面编写的代码。

接下来,在文件的最开头添加以下代码:

if ( isset( $_SERVER['REDIRECT_URL'] ) ) {

    $url = explode('/', $_SERVER['REDIRECT_URL'] );
    $_GET['id'] = $url[0];

}

我们在这做什么?在继续使用两个自己的代码之前,我们基本上是从旧URL中查找ID和信息,并将其提供给PHP的$ _GET变量。 我们基本上是在愚弄你的代码,认为请求有这些变量!

找到所有那些令人讨厌的<a/>标签并相应更换href的唯一障碍,但这是一个不同的故事。 :)

答案 1 :(得分:1)

它叫做mod_rewrite,这是一个教程:

http://www.workingwith.me.uk/articles/scripting/mod_rewrite

答案 2 :(得分:0)

使用PATH_INFO环境变量怎么样?

$path=explode("/",getenv("PATH_INFO"));
echo($path[0]."; ".$path[1] /* ... */);

将输出

product; Daves_Gourmet; Daves_insanity_Sauce

从使用$_GET到使用PATH_INFO环境的过渡是一个很好的编程练习。我认为你不能只通过配置完成任务。

答案 3 :(得分:0)

尝试这样的事情

RewriteRule ^/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)  /$1.php?id1=$2&id2=$3 [QSA]

然后使用$_GET获取参数值...

答案 4 :(得分:0)

我必须添加:在原始网址中,有一个'prod'键,它似乎包含一个ID。 确保在切换到重写的网址时,您不再仅仅依赖于唯一ID,因为这在网址中不可见。 现在,您可以使用ID来区分具有相同名称的2个产品,但是如果要重写URL并且不再需要URL中的ID,则需要确保1个产品名称不能多次用于不同产品。 同样,我看到'cat'-key不存在于所需的输出URL中,同样适用于上述。

忽略上述“问题”,重写应该看起来像:

RewriteRule ^/product/(.*?)/(.*?)$ /product?&cat=Grocery&q=$1&page=1&prod=B0000DID5R&prodName=$2

q&amp; prodName将收到强调的值,而不是%20,因此还需要一些修补。 正如你所看到的,我没有触及id&amp;类别,由你决定如何处理它。