url重写的build议,请

我想让我的网站更加友好,例如改变这个:

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文件,但这似乎非常复杂。

提前致谢

本·佩顿,实际上有一个非常简单的出路。 像WordPress的CMS倾向于使用它,而不是乱七八糟的正则表达式。


.htaccess方面

首先,你使用一个.htacess的内容如下:

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

让我解释它是如何做的(逐行):

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

以上只是一个快速的解释。 你并不需要它来使用它。

我们所做的是,我们告诉Apache,所有的请求将以404结尾,将它们传递给index.php文件,我们可以手动处理请求。


PHP方面

在PHP方面,在index.php ,你只需要解析原始的URL。 该URL以$_SERVER['REDIRECT_URL']形式传递到$_SERVER变量中。

最好的部分,如果没有重定向,这个变量没有设置!

所以,我们的代码将会像下面这样结束:

 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>'; ?> 

哪些与urls一起工作,如:

 index.php?id=5 

您可以使其与SEO网址一起工作,同时也可以与旧系统保持一致。 首先,确保.htaccess包含我在上面写的代码。

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

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

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

唯一剩下的障碍是找到所有那些讨厌的<a/>标签并相应地替换它们的href ,但这是一个不同的故事。 🙂

这就是所谓的mod_rewrite,这里是一个教程:

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

那么使用PATH_INFO环境变量呢?

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

会输出

 product; Daves_Gourmet; Daves_insanity_Sauce 

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

尝试一些这样的事情

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

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

我将不得不补充:在您的原始网址中,有一个“prod”键,它似乎由一个ID组成。 确保在切换到重写的URL时,不再仅仅依赖于唯一的ID,因为这在URL中是不可见的。 现在,您可以使用该ID来区分同名的两个产品,但是在重写url并且不再需要url中的ID的情况下,您需要确保1个产品名称不能多次使用产品。 同样,我看到'猫'键没有出现在所需的输出网址,同样适用于上述。

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

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

q&prodName将收到强调的值,而不是%20,所以也需要一些补丁。 正如你所看到的,我没有触及id和类别,这将取决于你如何处理。