首页 > php怎么实现类似segmentfault 的url重写?

php怎么实现类似segmentfault 的url重写?

php怎么实现类似 的url重写?


以下文章由360weboy撰写, 原文地址:结合Mod Rewrite以及PHP生成优化的SEO url。 360weboy – 专注php web开发, web前端开发, 打造专业的php社区。希望本篇文章对你有所帮助,感兴趣的话可以加入360weboy的qq群-197642724,或者关注360weboy的新浪或者腾讯微博,大家在一起分享讨论开发中的技术以及思想,如发现文章有什么不对之处,请在评论中及时指出,如果确实有问题,我会及时纠正。

虽然我不是一个专业的做seo优化的,但是在我接触到的一些项目中,知道了一些实现seo的方法。要生成对于用户以及搜索引擎友好的url链接,据我目前所了解的有两种方式:

1. 结合Mod Rewrite以及PHP生成优化的SEO url

2. 在应用程序的前端控制器中通过路由来解析seo化的url,然后再将请求分发(dispatch)到具体的针对此次请求的控制器中进行处理

这边文章主要介绍 – 结合Mod Rewrite以及PHP生成优化的SEO url的方式。对于动态网站来说,静态化的url比较有利于搜索引擎收录,是站点seo比较重要的一部分。

首先让我们来看一个搜索引擎比较讨厌的常规的url – http://www.yoursite.com/product.php?p...

很明显,当用户看像以上的一个url的时候,根本弄不清楚当前在看那个产品的信息。所以,我们有必要将改url转变为以下形式的链接:

http://www.yoursite.com/product/13/3/...

用户看到以上的url的时候,至少可以知道当前看的产品是2GB的MP3播放器。我们使用Apache Mod Rewrite就可以实现上述url的转变。

我常常将这个转变过程概括为: 正在找什么以及要到哪去。

什么是Mod Rewrite?

维基百科上的解释如下:

URL重写 (URL Rewriting) 是一种REST的相关技术,它可以在 Web Server 中,针对用户所提供的 URL 进行转换后,再传入 Web Server 中的程序处理器。

示例

最常见的用法,就是将一组 URL 层次结构字符串,转换成带有 query string 的 URL,或是反向转换,例如:
http://www.somebloghost.com/Blogs/Pos...
经过 URL 重写后,可以变成:
http://www.somebloghost.com/Blogs/200...
另一个例子,下面的 URL:
http://www.somehost.com/Blogs/2006/12...
经过 URL 重写后,可转换成:
http://www.somehost.com/Blogs.aspx?ye...

因此,用户可以使用较直接的方式来输入 URL(这也是 REST 的主要目的),是搜索引擎优化(SEO)的作法之一。而应用程序开发者可以利用这个机制来将参数隐藏起来,可避免让网络上的恶意用户收集到有利于发动攻击的信息。

我个人的理解就是,在用户通过一个url访问你的程序的时候,web服务器会检查这个请求的链接是否符合一定的转换规则,并且根据规则的定义对该url进行转换。这意味着,请求最终还是product.php进行处理,但是用户或者搜索引擎看到的是完全不同的url。

重写URL的步骤

目前为止, 我们已经明白了什么是Mod Rewrite。接下来,我们来具体学习下如何进行重写url。第一步就是要创建一个.htaccess的文件并且将该文件放在你站点的根目录下(只适用于Linux的web服务器,对于win类型的貌似是不起作用的)。 接着,你需要在.htaccess加入下述代码:

RewriteEngine on
RewriteRule ^article/([0-9]+)/([0-9]+)/(.*?).html$ /article.php?articleid=$1&categoryid=$2

我们来看下这两行代码具体什么意思。

RewriteEngine on

第一行代码告诉web服务器需要重写url, 不然服务器会抛出404错误。在你指定重写规则时,千万别忘了先加这行代码。

RewriteRule ^product/([0-9]+)/([0-9]+)/(.*?).html$ /product.php?productid=$1&categoryid=$2

第二行代码分为两部分: 第一个部分为一个正则表达式, 第二个部分为一个动态的url。 这两个部分结合起来告诉web服务器, 当解析的url符合规则 – ^product/([0-9]+)/([0-9]+)/(.*?).html$,那么将请求导向到/product.php?productid=$1&categoryid=$2。 就像我前面提到的,我把第一个部分理解正在找什么, 第二个部分理解为要到哪去。

第一部分 – 正在找什么?

上述的正则表达式就是定义了正在找什么。 让我们来把整个正则表达式分隔一下,将各个部分与我们一开始提到的url – http://www.yoursite.com/product/13/3/...:

1. ^product/告诉web服务器,视图匹配的url必须以product/这个字符串开头。这与url中的product/匹配。
2. 接下来的([0-9]+)告诉web服务器在/后面紧跟的是0-9之间的数字,该数字至少出现一次, 也就3. 是匹配的productid。 例如这个productid可以是1, 20, 567等等。
4. 继续匹配/, 然后又是一个([0-9]+), 道理一样,用来匹配categoryid
5. 继续匹配/, (.*?).html匹配任何以.html为后缀名,由任何数字或者字符为前缀
6. 最后,$表示匹配匹配字符串结尾

第二部分 – 到哪去?

这个就不用讲了,常规的动态url的解析。

好了,就是这么简单,至于怎么用php将项目中的url以seo化形式输出,相信大家都知道怎么做,就不写了。

以上文章由360weboy撰写, 原文地址:结合Mod Rewrite以及PHP生成优化的SEO url。 360weboy – 专注php web开发以及web前端开发, 努力打造专业的php社区。希望本篇文章对你有所帮助,感兴趣的话可以加入360weboy的qq群-197642724,或者关注360weboy的新浪或者腾讯微博,大家在一起分享讨论开发中的技术以及思想,如发现文章有什么不对之处,请在评论中及时指出,如果确实有问题,我会及时纠正。


大体来说有两种实现方式:

  1. webserver中配置重写规则,比如在apache中启用mod_rewrite,在nginx中使用rewrite指令;
  2. 数字列表单入口的应用中进行路由分发,多见于成熟的MVC框架,比如cakephp,不过这中需要webserver配置的辅助;

1.直接通过nginx或者apache的rewrite实现伪静态。
2.一般框架如CI,thinkphp都有程序单一入口(pathinfo):index.php
一般的URL:http: //localhost/project/index.php/news/1001
我们可以通过用nginx或者apache的rewrite 将URL的index.php隐藏达到重写的目的,简单方便。


2个步骤可以实现。

1.通过APACHE或者nginx或者IIS将真实地址变为伪静态地址,让伪静态地址能够访问;

2.通过程序正则的方法将html元素中的a标记href提取出来,将其伪静态,然后配合第一步便可实现。

实现方法如:

//将页面内容放入缓冲区
$content = ob_get_contents();
//进行正则匹配
$content = preg_replace(
			array("/\<a href\=\"live\.php\?tags\=(.*?)\&page\=(.*?)\"/i",
					"/\<a href\=\"live\.php\?tags\=(.*?)\"/i"),
			array("<a href=\"/live-tags-\\1-\\2.html\"",
					"<a href=\"/live-tags-\\1.html\""), $content);

//释放
obclean();
//输出
echo $content;

上面的正则变为你自己的,替换也变为自己的。。。。

【热门文章】
【热门文章】